Question

Je travaille sur un projet qui me implique l'utilisation d'un HashSet d'une classe que je fait, que je nommerai Test. Je défini les dit HashSet comme ceci:

HashSet<Test> t = new HashSet<Test>();
t.add(new Test("asdf", 1));
t.add(new Test("hello", 2));
t.add(new Test("hello", 3));

J'ai essayé d'utiliser

t.contains(new Test("asdf", 1));

mais il retourne false. Cependant, quand j'utilise un HashSet<Character> il semble fonctionner très bien. J'ai essayé redéfinissant la déclaration de equals précédente, mais cela n'a pas fonctionné. J'ai essayé de quitter equals seul, mais je suis encore false. Je dois savoir ce que je fais mal?

aussi, je ne pas modifier la fonction de hachage, i seulement changé Test.equals (Object o). C'est un projet simple et depuis la documentation java indique qu'il utilise o.equals (cela), je pensais que je ne devrais pas.

Était-ce utile?

La solution

Vous pourriez avoir à surcharger la méthode hashCode (), ainsi.

Autres conseils

HashSet.add(Object data) ne correspond pas à HashSet.add(new Test(String, int))

Essayez d'utiliser HashSet.add(new Test("asdf", 1));. Et faire de la méthode overrides de hashCode(). Est-ce que votre code compile?

Votre code ne sera pas même compiler ...

HashSet ne dispose pas d'une méthode add () qui accepte deux arguments.

Si vous voulez dire

t.add(new Test("asdf", 1));

au lieu de

t.add("asdf", 1);

être sûr que le hashcode et est égal à la méthode de la classe de test sont correctement mis en œuvre, comme dit précédemment.

En interne un Hashtable utilisera Objet # hashCode (), de hachage et un seau vos objets et d'objets # égaux () pour tester l'égalité s'il y a des affrontements hashCode. Vous devez vous assurer que votre classe de test fournit des implémentations appropriés (overrrides) ceux-ci, dans votre cas pour tester l'égalité de chaîne, sinon la méthode objet par défaut # equals () utilisera l'identité d'instance objets (id ref). Voir pour un tutoriel sur ce sujet .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top