2016-05-22 5 views
1

Ich habe eine hashmap mit einem Objektschlüssel und eine Arraylist eines anderen Objekts als Wert:Wie man eine Hashmappe der Liste in Java umkehrt?

HashMap<Object1, ArrayList<Object2>> map; 

Ein Object2 an mehreren Object1 gehören kann. Ich möchte es umkehren, so dass es wird:

HashMap<Object2, ArrayList<Object1>> reversed; 

Wie kann ich das tun?

Ich habe Lösungen zu hashmaps mit einem Objektschlüssel und einem Objektwert gesehen, aber anders dreht sich mein Problem um eine Arraylist als Wert.

+0

Diese Frage wahrscheinlich ein Duplikat ist. Googles Guava-Bibliothek hat eine sogenannte BiMap, eine bidirektionale Karte. Es gibt eine Methode 'BiMap.inverse()', die genau das tut, was Sie brauchen. –

Antwort

5

Sie können etwas tun:

HashMap<Object2, ArrayList<Object1>> reversed = new HashMap<>(); 

for(Map.Entry<Object1, ArrayList<Object2>> entry : map.entrySet()){ 
    List<Object2> list = entry.getValue(); 
    for(Object2 obj : list){ 
     if(reversed.containsKey(obj)){ 
      reversed.get(obj).add(entry.getKey()); 
     }else{ 
      reversed.put(obj, new ArrayList<Object1>(Arrays.asList(new Object1[]{entry.getKey()}))); 
     } 
    } 
} 
+0

Ich habe gehofft, wenn es noch einen schnelleren Weg gibt. Aber wenn nicht, dann würde das funktionieren. – davidchoo12

+0

Der Körper der inneren Schleife kann auf "reversed.computeIfAbsent" gekürzt werden (obj, k -> neue ArrayList ()). Add (entry.getKey()); '. – VGR