Bonjour,
Je suis autodidacte en Java et bien que j'ai résolu mon problème à l'aide de la rubrique suivante : http://java.developpez.com/faq/java/...#DIVERS_equals, je n'ai toujours pas compris pourquoi mon ancien code ne fonctionnait pas.
Je dispose d'une classe Tag possédant entre autre un champ String Name (c'est le seul important ici). Je souhaite pouvoir utiliser les ensembles hashSet<Tag> pour la rapidité des méthodes add, remove, et contains, et surtout pour l'élimination automatique des doublons.
J'ai donc redéfinit les méthodes hashCode et equals comme celà :
Et voici mon main dans lequelle je réalise mes tests :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public class Tag { private String name; private SomeType lotsOfOtherStuff; public Tag(String name) //constructeur { this.name = name; this.lotsOfOtherStuff = WhatItNeedToBe; } public getName() {return this.name;} public hashCode() {return this.name.hashCode();} public equals(Tag t) { return this.name.equals(t.getName()); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public class TestProto { public static void main(String[] args) { // test des hashSet<Tag> : System.out.println("Etape de test n°0 : teste des HashSet de Tags :"); HashSet<Tag> listeTag = new HashSet<Tag>(); Tag T1 = new Tag("test"); Tag T2 = new Tag("test"); System.out.println("T1.equals(T2) ? : " + T1.equals(T2) + " =?= VRAI"); System.out.println("T1.hashCode() == T2.hashCode() ? :" + (T1.hashCode() == T2.hashCode()) + " =?= VRAI"); listeTag.add(T1); System.out.println("listeTag.add(T2) ? : " + listeTag.add(T2) + " =?= FAUX");
Voici ce que j'obtiens lors de l'éxécution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Etape de test n°0 : teste des HashSet de Tags : T1 == T2 ? : true =?= VRAI <-- la méthode equals renvoie le bon résultat T1.hashCode() == T2.hashCode() ? :true =?= VRAI <-- la méthode hashCode fonctionne comme prévu listeTag.add(T2) ? : true =?= FAUX <-- pourtant T2 est quand même rajouter à mon hashSet...
La correction de la méthode equals à l'aide du lien plus haut résoud mon problème, mais çà ne me dit pas pourquoi avant çà ne marchait pas. Auriez-vous des explications svp ?
Voici à titre indicatif ma nouvelle méthode equals :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public boolean equals(Object T) { // Vérificationde la référence if (T==this) return true; //Vérification du type du paramètre puis de ses attributs. if (T instanceof Tag) { Tag Tbis = (Tag) T; return this.name.equals(Tbis.getName()); } else return false; }
Partager