2 votes

Quel est le moyen approprié de comparer deux objets avec des hashsets ?

J'ai une classe de personne qui a un nom et une liste d'amis dans HashSet.

Je veux remplacer un equals pour cette classe Personne. Voici ce que j'ai écrit jusqu'à présent.

Mais je ne suis pas sûr de cela, car je sais que les ensembles de hachages ne doivent pas nécessairement être dans l'ordre, et j'ai également entendu dire que je devais surcharger la méthode HashCode.

Quelles modifications dois-je apporter aux codes ci-dessous pour mettre en œuvre correctement la méthode 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;
}

modifier

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

2voto

home Points 8667

El == n'est pas du tout le bon opérateur pour le HashSet y name . Si vous voulez comparer des objets en java, utilisez la méthode equals. Le site == compare les identifiants internes des objets gérés par la JVM. Le contrat de HashSet 's equals est un document dans 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;
}

Vous pouvez vérifier si null aussi bien, peut-être name y fiends peut être nul.

Beaucoup de choses ont été écrites concernant equals y hashCode . La meilleure façon de procéder est de consulter la JavaDoc de l'entreprise. lava.lang.Object.equals() .

1voto

nicholas.hauschild Points 21796

La façon dont vous avez actuellement votre equals(Note) il ne retournera (presque) jamais la méthode true . Lorsque vous travaillez avec String vous devez toujours utiliser equals(String) jamais == .

Je créerais mon Note.equals(Note) une méthode comme celle-ci :

@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;
}

Vous remarquerez que le equals(Note) que j'ai fournie ci-dessus ne fait pas non plus friends.equals(target.getFriends()) . C'est parce que vous comparez le contenu HashSet et non le contenu de l'élément HashSet .

Enfin, si vous voulez que votre Note pour qu'elle soit correctement hachée, vous devrez également remplacer votre classe hashCode() méthode. Vous pouvez en savoir plus sur ce contrat dans la description de la méthode de l hashCode() dans la méthode Object documentation.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X