Traitement de LinkedHashMap

Traitement de LinkedHashMap - Java - Programmation

Marsh Posté le 09-09-2014 à 22:11:36    

Bonjour,
 
J ai une question a laquelle je ne trouve pas de reponse et je suis completement bloque. c est pourquoi je me tourne vers vous en esperant en avoir une chez vous.
 
j ai cree une classe duo tres simple qui a deux elements.
 

Code :
  1. public  class Duo  {
  2. int a;
  3. int b;
  4. public Duo(int a, int b){
  5.  this.a = a;
  6.  this.b = b;
  7. }
  8. /**
  9.  * @return the a
  10.  */
  11. public int getA() {
  12.  return a;
  13. }
  14. /**
  15.  * @param a the a to set
  16.  */
  17. public void setA(int a) {
  18.  this.a = a;
  19. }
  20. /**
  21.  * @return the b
  22.  */
  23. public int getB() {
  24.  return b;
  25. }
  26. /**
  27.  * @param b the b to set
  28.  */
  29. public void setB(int b) {
  30.  this.b = b;
  31. }
  32. }


 
Apres, en partant d une liste [0,1,2,3,4], je cree une LinkedHashMap avec comme cle un Duo et comme valeur un Integer dans laquelle je stocke :  
 

Code :
  1. Key : (0,1) -->>  Value 1
  2. Key : (0,2) -->>  Value 2
  3. Key : (0,3) -->>  Value 3
  4. Key : (0,4) -->>  Value 4
  5. Key : (1,2) -->>  Value 5
  6. Key : (1,3) -->>  Value 6
  7. Key : (1,4) -->>  Value 7
  8. Key : (2,3) -->>  Value 8
  9. Key : (2,4) -->>  Value 9
  10. Key : (3,4) -->>  Value 10


 
ce que j obtiens par le code suivant :
 
 

Code :
  1. LinkedHashMap<Duo, Integer> map = new LinkedHashMap<Duo, Integer>();
  2. List<Integer> values = Arrays.asList(0,1,2,3,4);
  3. int index = 1;
  4. for(Integer value : values){
  5.  int position = values.indexOf(value);
  6.  List<Integer> nextValues = values.subList(position + 1, values.size());
  7.  for(Integer nextValue : nextValues){
  8.   Duo duo = new Duo(value, nextValue);
  9.   map.put(duo, index);
  10.   index++;
  11.  }
  12. }
  13. Iterator<Duo> iterator = map.keySet().iterator();
  14. while (iterator.hasNext()) {
  15.  Duo key = iterator.next();
  16.  int a = key.getA();
  17.  int b = key.getB();
  18.         System.out.println("Key : (" + a + ","+ b + " ) -->> "+  " Value " + map.get(key));
  19. }


 
Rien de magique jusque la !!
 
Les ennuis commencent a partir du moment ou je veux recuperer le contenu de ma LinkedHashMap par le code suivant :
 
 
   

Code :
  1. for(Integer value : values){
  2.    
  3.       int position = values.indexOf(value);
  4.    List<Integer> nextValues = values.subList(position + 1, values.size());
  5.       for(Integer nextValue : nextValues){
  6.        Duo duo = new Duo(value, nextValue);
  7.           System.out.println("Value " + map.get(duo));
  8.   }
  9.  }


 
Sauf que je n obtiens que des Null. Et je ne sais pas ce qui se passe.
 
N.B. Peut etre il y d autres moyens pour le faire mais je tiens a utiliser une boucle for (pour parcourir la liste values value par value) pour des considerations reltives au resultat final auquel je compte aboutir (et que je n ai pas presente ici pour ne pas etre trop long)..........  
 
Merci encore une fois de votre aide.

Reply

Marsh Posté le 09-09-2014 à 22:11:36   

Reply

Marsh Posté le 10-09-2014 à 01:09:51    

[:sombrero67]

 

Si c'est une question serieuse, en gros:
- tu utilises une structure de donnees (LinkedHashMap) qui a besoin de verifier l'egalite entre les cles
- tu definis ta classe Duo sans definir l'egalite entre ses instances; du coup, elle va utiliser l'egalite par defaut qui est juste de comparer l'adresse en memoire (en gros)
- du coup, ton premier Duo que tu utilises pour inserer etant une instance differente que celui que tu crees plus tard pour recuperer la valeur, les addresses en memoire ne sont pas les memes et la map se comporte comme prevu: tu lui passes une cle qu'elle ne connait pas, du coup elle ne retourne rien.

 

Pour faire ce que tu veux, il faut que tu "overrides" les methodes equals() et hashcode() de ta classe Duo, par exemple:

public boolean equals(Object object) {
 return (object instanceof Duo && ((Duo)object).getA() == this.a  && ((Duo)object).getB() == this.b);
}

 

public int hashCode() {
 return a * 31 + b;
}


En remarque accessoire, lire la doc, ca aide aussi.


Message édité par lasnoufle le 10-09-2014 à 01:10:17

---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 10-09-2014 à 09:29:25    

Ok merci c est fait.  
 
Et ca marche.
 
Merci bcp

Reply

Sujets relatifs:

Leave a Replay

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