[Résolu] Probleme d'unicité dans un HashSet

Probleme d'unicité dans un HashSet [Résolu] - Java - Programmation

Marsh Posté le 01-12-2010 à 14:44:12    

J'ai le problème suivant, un HashSet accepte deux éléments identique.
Le code pour mettre le probleme en évidence:
 

Code :
  1. Couple c1=new Couple(1,1);
  2.   System.out.println(c1.hashCode());
  3.   Couple c2=new Couple(1,1);
  4.   System.out.println(c2.hashCode());
  5.   System.out.println(c1.equals(c1));
  6.   System.out.println(c1.equals(c2));
  7.   HashSet<Couple> h=new HashSet<Couple>();
  8.   System.out.println(h.add(c1));
  9.   System.out.println(h);
  10.   System.out.println(h.add(c1));
  11.   System.out.println(h);
  12.   System.out.println(h.add(c2));
  13.   System.out.println(h);


 
Qui me renvoie le résultat suivant:
 

2
2
true
true
true
[(1,1)]
false
[(1,1)]
true
[(1,1), (1,1)


 
La class Couple, ou j'ai bien défini la méthode equals() et hashCode():

Code :
  1. public class Couple {
  2. /**Attribut repr�sentant l'abscisse*/
  3. private int x;
  4. /**Attribut repr�sentant l'ordonn�e*/
  5. private int y;
  6. public int hashCode(){
  7.  return this.x+this.y;
  8. }
  9. public boolean equals(Couple p){
  10.  return ((this.x==p.x) && (this.y==p.y));
  11. }
  12. }


 
Need help, arrachage de cheveux en cours.  [:blessure]


Message édité par bibiwood le 01-12-2010 à 15:36:13
Reply

Marsh Posté le 01-12-2010 à 14:44:12   

Reply

Marsh Posté le 01-12-2010 à 15:35:31    


Solution trouvé:

HashSet is going to call the equals(Object) method, not
the equals(MyString) method. Since you have not overridden
equals(Object), you wind up using the version from Object
itself, which declares any two objects different unless they
are in fact the same instance.


 
Il faut ecrire une methode equals(Object p) et non equals(Couple p).
La version corrigée:

Code :
  1. public boolean equals(Object p){
  2.  if ( p instanceof Couple){
  3.   Couple nc=(Couple)p;
  4.   return ((this.x==nc.x) && (this.y==nc.y));
  5.  }
  6.  else return false;
  7. }


Reply

Marsh Posté le 01-12-2010 à 16:31:40    

Une bonne habitude est d'utiliser l'annotation "@Override", ca permet d'eviter les erreur de ce type, le compilateur t'aurai donne un message d'erreur.
 
Ensuite, pour la surcharge des methodes hashCode() et equals(), je te conseille de jeter un coup d'oeil sur ce lien (meme si pour ton cas, ton implementation est tres bien), http://java.sun.com/developer/Book [...] apter3.pdf

Reply

Marsh Posté le 01-12-2010 à 18:39:56    


Ok merci je prendrais le temps de jeter un coup d'oeil.  
De toute facon faudra que je revienne sur le HashCode pour optimiser tout ca un peu plus tard.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed