2016-11-30 4 views
1

Ich habe eine HashMaphinzufügen Element (e) während Schöpfung in Arraylist

myMap = new HashMap<String, ArrayList<String> >(); 

ich einen Code schreibe, wo ich will in ArrayList für die wichtigsten Elemente hinzufügen, wenn es in der Karte vorhanden ist,

myMap.get(key).add(element); 

oder erstellen Sie eine neue ArrayList, fügen Sie ein Element zur Liste hinzu und fügen Sie diese Liste zur Karte hinzu.

ArrayList<String> tmpArrList = new ArrayList<>(); 
tmpArrList.add(element); 
myMap.put(key, tmpArrayList); 

Schreiben drei Zeilen für einzelnes Element hinzugefügt wird, nicht gut aussehen zu mir, wie kann ichschreiben Sie es in einzelner Zeile mit Java 5 ..?

Antwort

2

Wenn Sie Java 8 verwenden, computeIfAbsent ist, was Sie brauchen:

myMap.computeIfAbsent(key, ArrayList::new).add(element); 

Dies wird eine neue ArrayList erzeugen und es in der Map setzen, wenn der angeforderte Schlüssel nicht bereits in der Map ist.

+0

Great!, Aber leider, ich habe etwas zu schreiben, die Java 1.5 und höher – SimpleGuy

+1

@SimpleGuy unterstützt Ich glaube nicht, gibt es eine 1-liner Lösung vor der Java 8 (es sei denn, Sie einige externe Bibliotheken verwenden) . – Eran

+0

Oder schreiben Sie Ihre eigene [Hilfsmethode] (http://stackoverflow.com/a/40884954/5221149). – Andreas

1

Wie Sie eine Lösung für Java 5 benötigen, das Beste, was Sie tun können, ist dies zu vereinfachen:

ArrayList<String> tmpArrList = new ArrayList<>(); 
tmpArrList.add(element); 
myMap.put(key, tmpArrayList); 

mit diesem:

myMap.put(key, new ArrayList<String>(Collections.singletonList(element))); 

Oder der Code, der es einen Eintrag hinzufügen zu Ihre Karte könnte sein:

if (!myMap.containsKey(key)) { 
    myMap.put(key, new ArrayList<String>()); 
} 
myMap.get(key).add(element); 

Sie könnten auch berücksichtigen er mit einem Multimap von Google Guava aber beachten Sie, dass es nur von Java 6 für die neuesten Versionen hoffentlich besagt, ist es bestehende updates für Java 5 der Versionen 13.0, 14.0, 16.0 und 17.0 erhältlich von here, mehr Details here . Hier

ist ein Beispiel dafür, wie man es benutzt:

ListMultimap<String, String> myMap = ArrayListMultimap.create(); 
// This will map the provided key with the provided value whetever the 
// total amount of values already mapped with this key 
myMap.put(key, element); 
+0

Laut Guavas [Versionsverlauf] (https://github.com/google/guava/wiki/ReleaseHistory): * Für die Releases 1.0 bis 11.0 ist JDK 1.5 oder höher erforderlich. Die Versionen 12.0 bis 20.0 erfordern JDK 1.6 oder neuer *. Da ['ArrayListMultimap'] (http://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/ArrayListMultimap.html) in 2.0 hinzugefügt wurde, sollte dies mit Version 11.0 geschehen . – Andreas

+0

@Andreas der Link, den ich zur Verfügung stelle, einen Backport von '13.0',' 14,0 ', '16.0' und' 17,0' vorschlagen, was noch besser ist –

1

Wie kann ich schreibe es in einzelnen Zeile ..? (aus Frage)
Ich habe etwas zu schreiben, die Java 1.5 und höher (von comment)

Sie können nicht unterstützt. Der kürzeste Weg, es zu schreiben ist:

ArrayList<String> list = myMap.get(key); 
if (list == null) 
    myMap.put(key, list = new ArrayList<String>()); 
list.add(element); 

Dies optimiert wird nur eine Karte Suche durchführen, im Gegensatz zu einer Implementierung containsKey() Verwendung zu erkennen, ob ein neues ArrayList benötigt wird.

Außer:

  1. Schreiben Sie einfach alles auf einer einzigen Zeile *:

    ArrayList<String> list = myMap.get(key); if (list == null) myMap.put(key, list = new ArrayList<String>()); list.add(element); 
    

    * Ja, das ist ein Witz, wenn auch technisch eine gültige Antwort auf die Frage.

  2. Erstellen Sie eine Hilfsmethode, z. in einer gemeinsamen Utility-Klasse:

    public static <K, V> void addToMapList(Map<K, ArrayList<V>> mapList, K key, V value) { 
        ArrayList<V> list = mapList.get(key); 
        if (list == null) 
         mapList.put(key, list = new ArrayList<V>()); 
        list.add(value); 
    } 
    

    Dann benutze es eine einzelne Zeile ist:

    MyUtil.addToMapList(myMap, key, element); 
    
  3. Verwenden Apache Commons Collections ™* Klasse MultiValueMap:

    MultiMap<String, String> myMap = new MultiValueMap<String, String>(); 
    
    myMap.put(key, element); 
    

    * Für Java 5, Verwenden Sie Version 4.0.

  4. Verwenden Google Guava* Klasse ArrayListMultimap:

    ListMultimap<String, String> myMap = ArrayListMultimap.create(); 
    
    myMap.put(key, element); 
    

    * Für Java 5, version 11.0 verwenden.

  5. Schreiben Sie Ihre eigene MultiMap.

+0

Leider muss ich mit mehreren Zeilen gehen ..... wie ich kann ändere die Karte in etwas anderes wie 'ListMultimap' – SimpleGuy

+0

@SimpleGuy Dann, wenn du es an vielen Orten machst, benutze # 2. – Andreas

Verwandte Themen