web-dev-qa-db-fra.com

Comment parcourir par LinkedHashMap avec des listes en tant que valeurs

J'ai la déclaration suivante LinkedHashMap.

LinkedHashMap<String, ArrayList<String>> test1

mon point est comment puis-je parcourir cette carte de hachage. Je souhaite procéder comme suit: pour chaque clé, récupérez l’arrayliste correspondant et affichez les valeurs une par une contre la clé.

J'ai essayé ceci mais get ne retourne que string,

String key = iterator.next().toString();  
ArrayList<String> value = (ArrayList<String> )test1.get(key)
49
P basak
for (Map.Entry<String, ArrayList<String>> entry : test1.entrySet()) {
    String key = entry.getKey();
    ArrayList<String> value = entry.getValue();
    // now work with key and value...
}

En passant, vous devriez vraiment déclarer vos variables comme type d’interface, comme Map<String, List<String>>.

135
matt b

Je suppose que vous avez une faute de frappe dans votre déclaration get et qu'il devrait s'agir de test1.get (clé). Si tel est le cas, je ne sais pas pourquoi il ne renvoie pas de liste de tableaux à moins que vous ne mettiez pas le type correct dans la carte en premier lieu.

Cela devrait fonctionner:

// populate the map
Map<String, List<String>> test1 = new LinkedHashMap<String, List<String>>();
test1.put("key1", new ArrayList<String>());
test1.put("key2", new ArrayList<String>());

// loop over the set using an entry set
for( Map.Entry<String,List<String>> entry : test1.entrySet()){
  String key = entry.getKey();
  List<String>value = entry.getValue();
  // ...
}

ou vous pouvez utiliser

// second alternative - loop over the keys and get the value per key
for( String key : test1.keySet() ){
  List<String>value = test1.get(key);
  // ...
}

Vous devez utiliser les noms d'interface lors de la déclaration de vos vars (et de vos paramètres génériques), sauf si vous avez une raison très spécifique pour laquelle vous définissez à l'aide de l'implémentation.

14
Eric B.
// iterate over the map
for(Entry<String, ArrayList<String>> entry : test1.entrySet()){
    // iterate over each entry
    for(String item : entry.getValue()){
        // print the map's key with each value in the ArrayList
        System.out.println(entry.getKey() + ": " + item);
    }
}
7
Mark Elliot

Dans Java 8:

Map<String, List<String>> test1 = new LinkedHashMap<String, List<String>>();
test1.forEach((key,value) -> {
    System.out.println(key + " -> " + value);
});
6
JonDoe297

Vous pouvez utiliser le jeu d'entrées et parcourir les entrées, ce qui vous permet d'accéder directement à la clé et à la valeur.

for (Entry<String, ArrayList<String>> entry : test1.entrySet() {
     System.out.println(entry.getKey() + "/" + entry.getValue());
}

J'ai essayé mais je ne récupère que la chaîne

Pourquoi penses-tu ça? La méthode get renvoie le type E pour lequel le paramètre de type générique a été choisi, dans votre cas ArrayList<String>.

6
Konrad Reiche