Wie konvertiere ich eine Map in Java in eine Liste?

Lesezeit: 5 Minuten

Benutzer-Avatar
Javaa

Wie konvertiere ich eine Map<key,value> zu einem List<value>? Soll ich über alle Kartenwerte iterieren und sie in eine Liste einfügen?

  • Ich denke, es ist kein gutes Modell, wenn man eine Karte in eine Liste umwandeln muss. Man sollte den Code so schreiben, dass diese Situation nicht eintritt.

    – Fehler passieren

    5. Dezember 2017 um 17:13 Uhr

List<Value> list = new ArrayList<Value>(map.values());

vorausgesetzt:

Map<Key,Value> map;

  • Vielen Dank! Ich ging von der Besetzung aus Collection zu List würde funktionieren.

    – asg

    18. Juni 2013 um 21:28 Uhr

  • Ich vermute, dass der Grund, warum es nicht funktioniert, darin besteht, dass die von values() zurückgegebene Sammlung von der zugrunde liegenden Map abhängig ist; Indem Sie stattdessen einen Kopierkonstruktoraufruf durchführen, weisen Sie Speicher zu und kopieren die Werte in diesen Speicher, wodurch die Verbindung unterbrochen wird …

    – Sheldon R.

    22. November 2013 um 16:14 Uhr

  • Wenn wir LinkedHashMap haben – bleibt die Bestellung gleich?

    Benutzer2022068

    6. Juni 2015 um 18:42 Uhr

  • @ user2022068 Ja, die Reihenfolge sollte bei LinkedHashMap beibehalten werden.

    – Susan W

    9. September 2016 um 10:16 Uhr

  • @SheldonR. ja – die von zurückgegebenen Sammlungen keySet() und values() sind im Allgemeinen Shim-Objekte, die eine Set- oder Collection-Ansicht der zugrunde liegenden Struktur liefern (keySet() gibt ein Set zurück, um keine Duplikate hervorzuheben). Zum values()das zurückgegebene Objekt kann sei ein List, wird es aber oft nicht sein. Das Erstellen einer echten Liste, wie Sie sagen, unterbricht die Verbindung, was bedeutet, dass Sie nicht mehr von der ursprünglichen Karte abhängig sind. Manchmal benötigen Sie jedoch nur eine Liste, weil einige APIs eine erfordern – was die Regel verstärkt, dass eine gute API nur die abstraktesten Schnittstellen benötigen sollte, mit denen sie davonkommen kann …

    – Susan W

    9. September 2016 um 10:26 Uhr


Benutzer-Avatar
coobird

Das Problem hier ist das Map hat zwei Werte (einen Schlüssel und einen Wert), während a List hat nur einen Wert (ein Element).

Daher ist das Beste, was getan werden kann, entweder einen zu bekommen List der Schlüssel oder der Werte. (Es sei denn, wir erstellen einen Wrapper, um das Schlüssel/Wert-Paar festzuhalten).

Angenommen, wir haben eine Map:

Map<String, String> m = new HashMap<String, String>();
m.put("Hello", "World");
m.put("Apple", "3.14");
m.put("Another", "Element");

Die Tasten als List kann durch Erstellen einer neuen abgerufen werden ArrayList von einem Set zurückgegeben durch die Map.keySet Methode:

List<String> list = new ArrayList<String>(m.keySet());

Während die Werte als a List kann eine neue erstellt werden ArrayList von einem Collection zurückgegeben durch die Map.values Methode:

List<String> list = new ArrayList<String>(m.values());

Das Ergebnis des Erhaltens der List von Schlüsseln:

Apple
Another
Hello

Das Ergebnis des Erhaltens der List von Werten:

3.14
Element
World

  • Es sollte beachtet werden, dass die Reihenfolge der von diesen Methoden zurückgegebenen Werte ist nicht definiert und für HashMap und ähnliches unsortiert Map Implementierungen wird es effektiv zufällig sein.

    – Joachim Sauer

    30. März 2011 um 8:02 Uhr

  • Ja, Sie müssten wissen, dass es sich um eine LinkedHashMap oder so etwas handelt. Das Problem mit der ursprünglichen Frage ist, dass die Frage falsch formuliert ist, dh sie muss bearbeitet werden. Die Frage ist nicht, eine Map in eine Liste umzuwandeln, sondern wie man die Werte der Map als Liste bekommt. Die Methodenwerte geben Ihnen eine Sammlung, aber keine Liste, und daher brauchen Sie einen netten kleinen Trick.

    – Dämongolem

    11. Februar 2012 um 19:47 Uhr

  • Ich denke, Sie könnten Ihrer Antwort hinzufügen, was @M0les sagt: Dass Sie SortedMap irgendwie “übergehen” müssten. Beginnen Sie entweder mit einer konkreten SortedMap-Implementierung (z. B. TreeMap) oder fügen Sie Ihre Eingabe-Map in eine SortedMap ein, bevor Sie diese in eine Liste konvertieren

    – Ignacio Rubio

    17. November 2014 um 16:33 Uhr

Benutzer-Avatar
Matej Kormuth

Verwenden der Java 8 Streams-API.

List<Value> values = map.values().stream().collect(Collectors.toList());

  • Ich bevorzuge die akzeptierte, Konstruktor-basierte Antwort. Streams sollten zur Vereinfachung von Code dienen.

    – Aaron

    24. Februar 2017 um 11:15 Uhr

  • @Aaron Ja, für die Aufgabe, eine Werteliste von Map zu erhalten, scheint der Konstruktor einfacher zu sein. Wenn Sie Streams jedoch ausgiebig in einer Codebasis verwenden, ist es besser, konsistent zu bleiben.

    – Matej Kormuth

    24. Februar 2017 um 13:57 Uhr

  • Wenn ich dies verwende, erhalte ich eine Fehlermeldung, wenn ich eine große Datenmenge abrufe. Der Thread läuft auf java.util.stream.ReduceOps$3.makeSink (unbekannte Quelle). Wenn Threads endlos schleifen, beginnt der CPU-Verbrauch zu steigen. Der Stack-Trace von Looping-Threads ist unten angegeben, untersuchen Sie ihn

    – Ganesh Giri

    23. August 2019 um 5:51 Uhr

Benutzer-Avatar
Java-Typ

map.entrySet() gibt Ihnen eine Sammlung von Map.Entry Objekte, die sowohl Schlüssel als auch Wert enthalten. Sie können dies dann in ein beliebiges Sammlungsobjekt umwandeln, z new ArrayList(map.entrySet());

Benutzer-Avatar
Diego Freundlich

eine Liste von was?

Vorausgesetzt map ist Ihre Instanz von Map

  • map.values() wird a zurückgeben Collection enthält alle Werte der Karte.
  • map.keySet() wird a zurückgeben Set enthält alle Schlüssel der Karte.

Ich vermute, Sie möchten die darin enthaltenen Werte umwandeln Map zu einem list? Am einfachsten ist es, die anzurufen values() Methode der Map Schnittstelle. Dies wird die zurückgeben Collection von Wertobjekten, die in der enthalten sind Map.

Beachten Sie, dass dies Collection wird unterstützt durch die Map Objekt und alle Änderungen an der Map Objekt wird hier widerspiegeln. Wenn Sie also eine separate Kopie wünschen, die nicht an Ihre gebunden ist Map Objekt, erstellen Sie einfach ein neues List Objekt wie ein ArrayList Wert übergeben Collection wie nachstehend.

ArrayList<String> list = new ArrayList<String>(map.values());

Benutzer-Avatar
SpringLearner

Du kannst es so machen

List<Value> list = new ArrayList<Value>(map.values());

  • OP fragt nach der Konvertierung in List. Wenn Sie Antworten geben, ist es besser, eine gute Beschreibung mit der vorgeschlagenen Lösung beizufügen. Diese Frage wurde bereits akzeptiert und beantwortet.

    – HaveNoDisplayName

    23. November 2014 um 0:45 Uhr


1017410cookie-checkWie konvertiere ich eine Map in Java in eine Liste?

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

Privacy policy