Как правильно сравнить два объекта с хэш-наборами? - PullRequest
2 голосов
/ 04 сентября 2011

У меня есть личный класс, у которого есть имя и список друзей в HashSet.

Я хочу переопределить метод equals для этого класса Person. Ниже то, что я написал до сих пор.

Но я не уверен в этом, потому что я знаю, что HashSet не обязательно должен быть в порядке, и я также слышал, что мне нужно переопределить метод HashCode.

Какие изменения я должен внести в приведенные ниже коды, чтобы правильно реализовать метод equals?

public boolean equals(Note target){
    if(this.name==target.getName() && this.friends == target.getFriends()){
        return true;
    }
    return false;
}

public HashSet<Person> getFriends(){
    return this.friends;
}

1012 * редактировать *

//override hashCode()
public int hashCode() {
    return name.hashCode() + friends.hashCode();
}

Ответы [ 2 ]

2 голосов
/ 04 сентября 2011

Оператор == определенно не подходит для HashSet и name. Если вы хотите сравнить объекты в Java, используйте метод equals. Оператор == сравнивает внутренние идентификаторы объектов, управляемые JVM. Контракт для метода HashSet equals является документом в AbstractSet.equals().

@Override
public boolean equals(Object o){

    if (o instanceof Note) {
        Note target = (Note) o;
        if(this.name.equals(target.getName()) && this.friends.equals(target.getFriends())){
            return true;
        }
    }
    return false;
}

Вы можете также проверить наличие null, возможно, name и fiends могут быть нулевыми.

Много было написано относительно equals и hashCode. Лучше всего заглянуть в JavaDoc для lava.lang.Object.equals().

1 голос
/ 04 сентября 2011

При том, как вы сейчас настроили метод equals(Note), он (почти) никогда не вернет true.При работе с String объектами вы всегда должны использовать equals(String), никогда ==.

Я бы создал свой метод Note.equals(Note) примерно так:

@Override
public boolean equals(Object obj){
    if(obj instanceof Note) {
        Note target = (Note) obj;
        if(name.equals(target.name) && friends.containsAll(target.friends)
              && friends.size() == target.friends.size()){
            return true;
        }
    }
    return false;
}

Вы заметитечто метод equals(Note), который я предоставил выше, также не делает friends.equals(target.getFriends()).Это потому, что вы сравниваете содержащий HashSet, а не содержимое HashSet.

Наконец, если вы хотите, чтобы ваш Note класс хэшировался правильно, вам также потребуется переопределить ваш hashCode() метод.Подробнее об этом контракте можно прочитать в описании метода hashCode() в документации Object.

public int hashCode() {
    return name.hashCode() + friends.hashCode();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...