Set не работает с переопределенными равными - PullRequest
2 голосов
/ 03 февраля 2012

Я пытался использовать набор.поэтому я попытался таким образом

HashSet set=new HashSet();
Points p1 = new Points(10, 20);
Points p2 = new Points(10, 20);
System.out.println(set.add(p1)); // output true
System.out.println(set.add(p2));  // output false

Я знаю, что мой первый вывод будет верным, а второй будет ложным, так как Set не допустит дублирования элементов.И я также знаю, что Set добиться этого с помощью метода equals (Object o).Который происходит из класса Java объекта со следующей подписью.

public boolean equals(Object o) {}

Для тестирования этого немного глубже я написал свой собственный класс

class testSet{
    private int x;
    private int y;
    public testSet(int xa, int ya){
        this.x=xa;
        this.y=ya;
    }
    @Override
    public boolean equals(Object o){
        if (o instanceof testSet){
            testSet ts=(testSet)o;
            return ts.x==this.x && ts.y==this.y;
        }
        return false;
    }
}

Теперь я ожидаю, что следующий код будет вести себя так же, как класс Point

HashSet set=new HashSet();
testSet set_a=new testSet(3,4);
testSet set_b=new testSet(3,4);
System.out.println(set.add(set_a)); //output expected true
System.out.println(set.add(set_b)); //output expected false

Поэтому я ожидаю, что первый вывод будет истинным, а второй ложным.Но это всегда возвращает истину для обоих случаев.Но работал на класс Point.И я попробовал следующие две реализации Point

android.graphics.Point
java.awt.point 

Так что я сделал не так?Спасибо за помощь, ребята.

1 Ответ

15 голосов
/ 03 февраля 2012

Вам необходимо переопределить hashCode, а также equals.Общий контракт hashCode заключается в том, что если два объекта равны (в смысле equals), то они имеют одинаковый хэш-код.

...