Traitement de LinkedHashMap

Fermé
ahmadou_20 - 9 sept. 2014 à 22:12
KX Messages postés 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 - 9 sept. 2014 à 22:32
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.



public class Duo {

int a;

int b;


public Duo(int a, int b){

this.a = a;
this.b = b;
}


/**
* @return the a
*/
public int getA() {
return a;
}


/**
* @param a the a to set
*/
public void setA(int a) {
this.a = a;
}


/**
* @return the b
*/
public int getB() {
return b;
}


/**
* @param b the b to set
*/
public void setB(int b) {
this.b = b;
}
}



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 :



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


ce que j obtiens par le code suivant :




LinkedHashMap<Duo, Integer> map = new LinkedHashMap<Duo, Integer>();

List<Integer> values = Arrays.asList(0,1,2,3,4);

int index = 1;

for(Integer value : values){

int position = values.indexOf(value);
List<Integer> nextValues = values.subList(position + 1, values.size());
for(Integer nextValue : nextValues){
Duo duo = new Duo(value, nextValue);
map.put(duo, index);
index++;
}
}

Iterator<Duo> iterator = map.keySet().iterator();

while (iterator.hasNext()) {
Duo key = iterator.next();
int a = key.getA();
int b = key.getB();
System.out.println("Key : (" + a + ","+ b + ") -->> "+ " Value " + map.get(key));
}


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 :



     
for(Integer value : values){

int position = values.indexOf(value);
List<Integer> nextValues = values.subList(position + 1, values.size());

for(Integer nextValue : nextValues){
Duo duo = new Duo(value, nextValue);
System.out.println("Value " + map.get(duo));
}
}


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.

1 réponse

KX Messages postés 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
9 sept. 2014 à 22:32
Bonjour,

Tu n'as pas redéfini les méthodes hashCode et equals, en conséquence tout tes objets sont différents, même s'ils ont les même valeur de a et b.
Du coup quand tu fais un map.get(duo) tu essayes de récupérer une clé qui n'existe pas vu que l'objet en clé est différent de l'objet clé pour l'insérer...

Il faut toujours redéfinir ces deux méthodes avant de les utiliser comme clé d'une hashMap. Je t'invites aussi à redéfinir toString, c'est la base.

Remarque : tu peux simplier la partie
while (iterator.hasNext())
en faisant une boucle for each comme tu l'as faite pour les listes :

for (Entry<Duo, Integer> entry : map.entrySet())
    System.out.println("Key : "+entry.getKey()+" -->> Value "+entry.getValue());
0