En Java, comment obtenir les valeurs d'un HashMap
retourné sous la forme d'un List
?
HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put (1, "Mark");
map.put (2, "Tarryn");
List<String> list = new ArrayList<String>(map.values());
for (String s : list) {
System.out.println(s);
}
En supposant que vous ayez:
HashMap<Key, Value> map; // Assigned or populated somehow.
Pour une liste de valeurs:
List<Value> values = new ArrayList<Value>(map.values());
Pour une liste de clés:
List<Key> keys = new ArrayList<Key>(map.keySet());
Notez que l'ordre des clés et des valeurs ne sera pas fiable avec un HashMap; utilisez un LinkedHashMap si vous devez conserver une correspondance individuelle des positions de clé et de valeur dans leurs listes respectives.
Fondamentalement, vous ne devriez pas déranger la question avec la réponse, car elle est source de confusion.
Ensuite, vous pouvez spécifier la moyenne de conversion et choisir l’une de ces solutions
List<Integer> keyList = Collections.list(Collections.enumeration(map.keySet()));
List<String> valueList = Collections.list(Collections.enumeration(map.values()));
Collection Interface a 3 vues
D'autres ont répondu à pour convertir Hashmap en deux listes de clé et de valeur. C'est parfaitement correct
My addition: Comment convertir une "paire clé-valeur" (alias entrySet) en liste.
Map m=new HashMap();
m.put(3, "dev2");
m.put(4, "dev3");
List<Entry> entryList = new ArrayList<Entry>(m.entrySet());
for (Entry s : entryList) {
System.out.println(s);
}
ArrayList a ce constructeur.
Solution utilisant Java 8 et Stream Api:
private static <K, V> List<V> createListFromMapEntries (Map<K, V> map){
return map.values().stream().collect(Collectors.toList());
}
Usage:
public static void main (String[] args)
{
Map<Integer, String> map = new HashMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
List<String> result = createListFromMapEntries(map);
result.forEach(System.out :: println);
}
Si vous souhaitez conserver le même ordre dans votre liste, dites: votre carte ressemble à:
map.put(1, "msg1")
map.put(2, "msg2")
map.put(3, "msg3")
et vous voulez que votre liste ressemble
["msg1", "msg2", "msg3"] // same order as the map
vous devrez parcourir la carte:
// sort your map based on key, otherwise you will get IndexOutofBoundException
Map<String, String> treeMap = new TreeMap<String, String>(map)
List<String> list = new List<String>();
for (treeMap.Entry<Integer, String> entry : treeMap.entrySet()) {
list.add(entry.getKey(), entry.getValue());
}
Si vous voulez seulement qu'il se répète sur votre HashMap, vous n'avez pas besoin d'une liste:
HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put (1, "Mark");
map.put (2, "Tarryn");
for (String s : map.values()) {
System.out.println(s);
}
Bien sûr, si vous souhaitez modifier la structure de votre carte (c'est-à-dire plus que changer la valeur d'une clé existante) pendant l'itération, vous feriez mieux d'utiliser la méthode "copy to ArrayList", sinon vous obtiendrez une ConcurrentModificationException. Ou exporter en tant que tableau:
HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put (1, "Mark");
map.put (2, "Tarryn");
for (String s : map.values().toArray(new String[]{})) {
System.out.println(s);
}