Wie man LinkedHashMap mit Listen als Werten durchläuft

Lesezeit: 4 Minuten

Benutzer-Avatar
P basak

Ich habe folgende LinkedHashMap-Deklaration.

LinkedHashMap<String, ArrayList<String>> test1

Mein Punkt ist, wie ich diese Hash-Map durchlaufen kann. Ich möchte dies im Folgenden tun, für jeden Schlüssel die entsprechende Arrayliste erhalten und die Werte der Arrayliste einzeln gegen den Schlüssel drucken.

Ich habe das aber versucht erhalten gibt nur String zurück,

String key = iterator.next().toString();  
ArrayList<String> value = (ArrayList<String> )test1.get(key)

  • LinkedHashMap wird zum Beibehalten der Reihenfolge verwendet. Weder die Frage noch die Antworten erwähnen die Bestellung. Bitte ersetzen Sie LinkedHashMap durch HashMap. Das ist sehr verwirrend

    – Apflieger

    13. Mai 2020 um 7:49 Uhr

for (Map.Entry<String, ArrayList<String>> entry : test1.entrySet()) {
    String key = entry.getKey();
    ArrayList<String> value = entry.getValue();
    // now work with key and value...
}

Übrigens sollten Sie Ihre Variablen stattdessen wirklich als Schnittstellentyp deklarieren, z Map<String, List<String>>.

  • Übrigens, ich möchte die Liste mit der Reihenfolge der Einfügungen haben, ich habe zuvor Hashmap verwendet, aber es hat die Reihenfolge durcheinander gebracht.

    – P Basak

    7. September 2012 um 2:34 Uhr

  • Ich sage nicht, nicht verwenden LinkedHashMap – aber in der Regel ist es am besten, Dinge wie zu deklarieren Map<String, List<String>> map = new LinkedHashMap<String, List<String>>.

    – matt b

    7. September 2012 um 2:36 Uhr

  • Warum ist die Reihenfolge garantiert, wenn entrySet ein Set zurückgibt? Ich weiß, dass die Reihenfolge in der LinkedHashMap garantiert ist, aber die Dokumente besagen, dass der Iterator eines Satzes keine Garantie für die Reihenfolge gibt

    – Jonathan.

    7. Dezember 2014 um 13:31 Uhr

  • Warum haben Sie dann ArrayList in den Deklarationen beibehalten?

    Benutzer985358

    5. Januar 2016 um 13:42 Uhr

  • @Jonathan., gute Frage. Besser spät als nie: Siehe die Antwort unter stackoverflow.com/a/2924143/423105

    – LarsH

    2. Juni 2016 um 22:04 Uhr

Ich gehe davon aus, dass Sie einen Tippfehler in Ihrer get-Anweisung haben und dass es test1.get(key) sein sollte. Wenn ja, bin ich mir nicht sicher, warum es keine ArrayList zurückgibt, es sei denn, Sie geben überhaupt nicht den richtigen Typ in die Karte ein.

Das sollte funktionieren:

// populate the map
Map<String, List<String>> test1 = new LinkedHashMap<String, List<String>>();
test1.put("key1", new ArrayList<String>());
test1.put("key2", new ArrayList<String>());

// loop over the set using an entry set
for( Map.Entry<String,List<String>> entry : test1.entrySet()){
  String key = entry.getKey();
  List<String>value = entry.getValue();
  // ...
}

oder Sie können verwenden

// second alternative - loop over the keys and get the value per key
for( String key : test1.keySet() ){
  List<String>value = test1.get(key);
  // ...
}

Sie sollten die Schnittstellennamen verwenden, wenn Sie Ihre Variablen deklarieren (und in Ihren generischen Parametern), es sei denn, Sie haben einen ganz bestimmten Grund, warum Sie die Implementierung verwenden.

  • Hallo, ich habe linkhashmap verwendet, um die Elemente in der Reihenfolge der Einfügung zu halten.

    – P Basak

    7. September 2012 um 2:35 Uhr

  • Sicher – aber Sie können LinkedHashMap beim Erstellen der Instanz angeben. Wenn Sie jedoch den Schnittstellennamen für die Variable verwenden, können Sie die Codeimplementierung unabhängig machen. dh: Sie können die Implementierung später leicht durch etwas anderes ersetzen, ohne alles neu codieren zu müssen. Siehe mein obiges Beispiel für die Deklaration mit der Schnittstelle als var und die LinkedHashMap für die Implementierung.

    – Eric B.

    7. September 2012 um 2:38 Uhr

Unter Java8:

Map<String, List<String>> test1 = new LinkedHashMap<String, List<String>>();
test1.forEach((key,value) -> {
    System.out.println(key + " -> " + value);
});

Benutzer-Avatar
Konrad Reiche

Sie können den Eintragssatz verwenden und über die Einträge iterieren, wodurch Sie direkt auf Schlüssel und Wert zugreifen können.

for (Entry<String, ArrayList<String>> entry : test1.entrySet()) {
     System.out.println(entry.getKey() + "/" + entry.getValue());
}

Ich habe das versucht, bekomme aber nur eine Zeichenfolge zurück

Warum denkst du das? Die Methode get gibt den Typ zurück E für die in Ihrem Fall der generische Typparameter gewählt wurde ArrayList<String>.

// iterate over the map
for(Entry<String, ArrayList<String>> entry : test1.entrySet()){
    // iterate over each entry
    for(String item : entry.getValue()){
        // print the map's key with each value in the ArrayList
        System.out.println(entry.getKey() + ": " + item);
    }
}

  • Ich habe nie daran gedacht, ich habe foreach in C # verwendet, das ist ähnlich.

    – P Basak

    7. September 2012 um 2:32 Uhr

  • Ich habe nie daran gedacht, ich habe foreach in C # verwendet, das ist ähnlich.

    – P Basak

    7. September 2012 um 2:32 Uhr

1092830cookie-checkWie man LinkedHashMap mit Listen als Werten durchläuft

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy