Я провел этот тест при сравнении HashSet, и equals
не вызывается
Я хотел бы считать равным, когда farAway = false (функция для проверки двухточечных расстояний)
Полный компилируемый код, вы можете протестировать его, и расскажет, почему в этом примере не вызывается equals.
public class TestClass{
static class Posicion
{
private int x;
private int y;
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Posicion other = (Posicion) obj;
if ( farAway(this.x, other.x, this.y, other.y,5)){
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 7; hash = 59 * hash + this.x; hash = 59 * hash + this.y;
return hash;
}
Posicion(int x0, int y0) {
x=x0;
y=y0;
}
private boolean farAway(int x, int x0, int y, int y0, int i) {
return false;
}
}
public static void main(String[] args) {
HashSet<Posicion> test=new HashSet<>();
System.out.println("result:"+test.add(new Posicion(1,1)));
System.out.println("result:"+test.add(new Posicion(1,2)));
}
}
ИЗМЕНИТЬ
-Есть ли способ принудительно добавить HashSet для вызова равенства?
farAway
внутриequals
?? ваш класс нарушает договор междуhashCode
иequals
! - person Alonso Dominguez   schedule 24.01.2013hashCode
иequals
. Это означает, что когда вашequals
метод возвращает true, выhashCode
должны возвращать то же целочисленное значение. А в вашем коде этого не происходит. - person Alonso Dominguez   schedule 24.01.2013hashCode()
, но и контрактequals()
.equals()
должен быть переходным. Поэтому, если вы вернетеtrue
для A и B, потому что они близки друг к другу, а B и C, потому что они близки друг к другу, вы столкнетесь с проблемами при проверке равенства между A и C, если они не близки. Я думаю, вам нужно будет разработать структуру контейнера / данных, отличную от стандартного HashSet, чтобы делать то, что вы хотите (если то, что вы хотите сделать, это вообще хорошая идея). - person Michael Burr   schedule 24.01.2013