Wie konvertiere ich eine Map<key,value>
zu einem List<value>
? Soll ich über alle Kartenwerte iterieren und sie in eine Liste einfügen?
Wie konvertiere ich eine Map in Java in eine Liste?
Javaa
List<Value> list = new ArrayList<Value>(map.values());
vorausgesetzt:
Map<Key,Value> map;
-
Vielen Dank! Ich ging von der Besetzung aus
Collection
zuList
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()
undvalues()
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). Zumvalues()
das zurückgegebene Objekt kann sei einList
, 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
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 unsortiertMap
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
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
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())
;
Diego Freundlich
eine Liste von was?
Vorausgesetzt map
ist Ihre Instanz von Map
map.values()
wird a zurückgebenCollection
enthält alle Werte der Karte.map.keySet()
wird a zurückgebenSet
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());
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
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