2016-05-09 12 views
0

Abend!Hinzufügen eines Werts zu einer Liste zu einem bereits vorhandenen Schlüssel in Karte

Ich habe folgende Karte:

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

Ich habe dann die folgenden Daten hinzu:

ArrayList myList = new ArrayList(); 
myList.add("Test 1"); 
myList.add("Test 2"); 
myList.add("Test 3"); 
myMap.put("Tests", myList); 

Dies ließ mich mit den folgenden Daten:

Key: Tests


Werte: Test 1, Test 2, Test 3

Meine Frage ist, wie kann ich dann neue Werte hinzufügen, auf meine bereits vorhandenen Schlüssel? Wie könnte ich zum Beispiel den Wert "Test 4" zu meinem Schlüssel "Tests" hinzufügen.

Danke.

+1

'myMap.get ("Tests"). Add ("Test 4")' – dabadaba

+3

Warum Sie ist 'eine rohe Art ArrayList'? ** Benutze niemals Rawtypes. –

Antwort

3

Setzen Sie sich einfach die Liste aus der Karte und dann das Element zur Liste hinzufügen:

ArrayList list = myMap.get("Tests"); 
list.add("Test4"); 

Es gibt einige andere Dinge, die über Ihren Code bemerkt werden kann. Zunächst einmal don't use the raw typeArrayList. Verwenden Sie Generics:

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

ArrayList<String> myList = new ArrayList<String>(); 
myList.add("Test 1"); 
myList.add("Test 2"); 
myList.add("Test 3"); 
myMap.put("Tests", myList); 

Zweitens Programm zu Schnittstellen, nicht Implementierungen. Mit anderen Worten, Programm unter Verwendung der Schnittstellen Map und List anstelle der Implementierungen HashMap und ArrayList. Dies ist ein bekanntes OO-Programmierprinzip, das es beispielsweise erleichtert, bei Bedarf auf eine andere Implementierung umzusteigen.

Map<String, List<String>> myMap = new HashMap<String, List<String>>(); 

List<String> myList = new ArrayList<String>(); 
myList.add("Test 1"); 
myList.add("Test 2"); 
myList.add("Test 3"); 
myMap.put("Tests", myList); 

Schließlich wird ein Syntax-Tipp: wenn Sie mit Java 7 oder neuer Sie <> verwenden können, und Sie müssen nicht die Art Argumente wiederholen:

Map<String, List<String>> myMap = new HashMap<>(); 

List<String> myList = new ArrayList<>(); 
myList.add("Test 1"); 
myList.add("Test 2"); 
myList.add("Test 3"); 
myMap.put("Tests", myList); 

myMap.get("Tests").add("Test 4"); 
+2

Oder sogar 'myMap.computeIfAbsent (" Tests ", k -> neue ArrayList <>())', für die nächste Frage von "warum habe ich eine' NullPointerException' mit einem anderen Schlüssel ". –

+0

@BoristheSpider wow, ich wusste das nicht. Wurde es in Java 8 eingeführt? Gibt es auch eine ähnliche für 'Put'? – dabadaba

+0

@dabadaba, ja - wie es ein Lambda hat. Was würde genau das für "Put" tun? –

4

Ich würde empfehlen, mit Map#computeIfAbsent, um sicherzustellen, immer ein List aus der Karte abrufen:

private final Map<String, List<String>> example = new HashMap<>(); 

private List<String> getList(String key) { 
    return this.example.computeIfAbsent(key, k -> new ArrayList<>()); 
} 

//elsewheres 
getList("test").add("foobar"); 
getList("test").forEach(System.out::println); // "foobar" 

Dies bedeutet, dass, wenn die Karte nicht enthält einen Eintrag für die key, verwendet es das bereitgestellte Lambda, um einen neuen Wert für den Schlüssel zu erzeugen und diesen zurückzugeben.

+1

Aber das bringt den Wert in der Karte richtig? Ich bin nicht sicher, ob mir die Idee, Daten in eine Sammlung zu stellen, gefällt, wenn wir eine ** Getter ** -Methode verwenden. – dabadaba

+0

Es setzt den Wert, wenn es fehlt, die Idee ist, dass Sie säumig sind. Wenn die Ressource nicht für Sie verfügbar ist, wird sie erstellt und die neue Ressource bereitgestellt. Perfekt gültig. – Rogue

1
import java.util.*; 

class M { 
    public static void main(String ... args) { 
     List<String> l = new ArrayList<>(); 
     l.add("Test 1"); 
     l.add("Test 2"); 
     l.add("Test 3"); 

     Map<String,List<String>> m = new HashMap<>(); 
     m.put("Tests", l); 

     // some time later that day ... 
     m.computeIfAbsent("Tests", k -> new ArrayList<>()).add("Test 4"); 
     System.out.println(m); 
    } 
} 
+0

Ich mag den Einzeiler (vorletzte Zeile). – Jan

Verwandte Themen