Java contains () метод возвращает False, хотя переопределенный equals () возвращает True - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть класс объекта с именем Record, который состоит из вектора Data Объекты класса. Класс объекта Data содержит только две переменные

Object value;
String name;

Я переопределяю метод equals в Record class следующим образом:

public boolean equals(Object obj) {
    boolean check = true;
    for(int i=0; i<this.coloumnsOfData.size();i++) {
        System.out.println( ((Record) obj).coloumnsOfData.get(i).name + " OBJECT " + ((Record) obj).coloumnsOfData.get(i).value );
        System.out.println( coloumnsOfData.get(i).name + " THIS " + coloumnsOfData.get(i).value );
        if( !((((Record) obj).coloumnsOfData.get(i).name).equals(this.coloumnsOfData.get(i).name))   || !((((Record) obj).coloumnsOfData.get(i).value).equals(this.coloumnsOfData.get(i).value))) {

            check=false;
        }
    }


    return (obj instanceof Record && check);
}

Я инициализирую HashSet следующим образом: Set<Record> answer= new HashSet<Record>() и начинаю тестирование

            Record r1 = new Record();
            r1.coloumnsOfData.add(new Data(new Double( 1.5 ),"gpa"));
            r1.coloumnsOfData.add(new Data(new String("John"),"name"));
            r1.coloumnsOfData.add(new Data(new Integer( 2 ),"id"));

            Record r2 = new Record();
            r2.coloumnsOfData.add(new Data(new Double( 1.5 ),"gpa"));
            r2.coloumnsOfData.add(new Data(new String("John"),"name"));
            r2.coloumnsOfData.add(new Data(new Integer( 2 ),"id"));
            System.out.println(r1.equals(r2)); //RETURNS TRUE
            answer.add(r1);
            System.out.println(answer.contains(r2)); //RETURNS FALSE

Любая помощь, понимающая, где проблема, будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Попробуйте переопределить также метод hashCode. Он должен работать. Вы можете найти объяснение здесь: Метод HashSet содержит ()

0 голосов
/ 06 апреля 2020

HashSet полагается на контракт, что hashCode с равными объектами равны. То есть, если a.equals (b) возвращает true, то a.hashCode () должен совпадать с b.hashCode ()

. Чтобы использовать его в HashSet

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...