2009-12-01 6 views
0

Je travaille sur un projet qui m'implique en utilisant un HashSet d'une classe que j'ai faite, que je nommerai Test. Je défini les dit HashSet comme ceci:Pourquoi ma classe ne fonctionne pas correctement dans un Java HashSet?

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 correctement. J'ai essayé de remplacer la précédente déclaration equals, mais cela n'a pas fonctionné. J'ai essayé de laisser equals seul, mais j'ai toujours false. J'ai besoin de savoir ce que je fais mal?

également, je n'ai pas édité la fonction de hachage, j'ai seulement changé Test.equals (Object o). C'est un projet simple et puisque la documentation de Java indique qu'il utilise o.equals (ceci), je pensais que je n'aurais pas à le faire.

+1

Pouvez-vous publier la classe Your Test, notamment les méthodes equals et hashCode. – Joel

+0

'HashSet.add' prend seulement un argument, pas deux. Et votre deuxième bloc de code contient une erreur de syntaxe. – Thomas

+4

En outre, le point de HashSet est que votre HashSet contiendra des instances de test. Il devrait donc être t.add (nouveau test ("asdf", 1)); – Mike

Répondre

5

Vous devrez peut-être également surcharger la méthode hashCode().

+10

Cela devrait être "volonté", pas "pourrait". –

2

En interne, une table de hachage utilisera Object # hashCode(), pour hacher et placer vos objets en hachage, et Object # equals() pour tester l'égalité s'il y a des conflits hashCode. Vous devez vous assurer que votre classe Test fournit des implémentations appropriées (overrides), dans votre cas pour tester l'égalité des chaînes, sinon la méthode par défaut Object # equals() utilisera l'identité de l'instance des objets (ref id). Voir here pour un tutoriel sur ce sujet.

4

HashSet.add(Object data) est pas égal à HashSet.add(new Test(String, int))

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

3

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

HashSet ne possède pas de 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 que le hashcode et equals méthode de la classe de test sont correctement mis en œuvre, comme dit précédemment.