web-dev-qa-db-fra.com

Comment convertir un HashMap en une liste en Java?

En Java, comment obtenir les valeurs d'un HashMap retourné sous la forme d'un List?

51
Spider
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);
}
87
Spider

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.

70
maerics

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

  • jeu de clés
  • valeurs
  • entrySet

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.

6
VdeX

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);
    }
5
RichardK

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());
}  
1
Shengjie

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);
}
1
Paŭlo Ebermann