Was ist der beste Weg, um a Map<key,value>
in a umzuwandeln List<value>
? Durchlaufen Sie einfach alle Werte und fügen Sie sie in eine Liste ein, oder übersehen Sie etwas?
Was ist der beste Weg, um a Map<key,value>
in a umzuwandeln List<value>
? Durchlaufen Sie einfach alle Werte und fügen Sie sie in eine Liste ein, oder übersehen Sie etwas?
Antworten:
List<Value> list = new ArrayList<Value>(map.values());
vorausgesetzt:
Map<Key,Value> map;
Collection
, dass die Besetzung von bis List
funktionieren würde.
keySet()
und zurückgegebenen Sammlungen values()
sind Shim-Objekte, die eine Set- oder Collection-Ansicht der zugrunde liegenden Struktur enthalten ( keySet()
gibt ein Set zurück, um keine Dupes hervorzuheben). Denn values()
das zurückgegebene Objekt kann ein sein List
, wird es aber oft nicht sein. Wenn Sie, wie Sie sagen, eine echte Liste erstellen, wird der Link unterbrochen, sodass Sie nicht mehr von der ursprünglichen Karte abhängig sind. Manchmal benötigen Sie jedoch nur eine Liste, da für eine API eine erforderlich ist.
Das Problem hierbei ist, dass Map
zwei Werte (ein Schlüssel und ein Wert) vorhanden sind, während a List
nur einen Wert (ein Element) hat.
Daher ist das Beste, was getan werden kann, entweder einen List
der Schlüssel oder die Werte zu erhalten. (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 Schlüssel als List
können erhalten werden, indem ArrayList
aus einem Set
von der Map.keySet
Methode zurückgegebenen Schlüssel ein neuer erstellt wird:
List<String> list = new ArrayList<String>(m.keySet());
Während die Werte als erhalten werden List
können, erstellen Sie eine neue ArrayList
aus einer Collection
von der Map.values
Methode zurückgegebenen:
List<String> list = new ArrayList<String>(m.values());
Das Ergebnis des Erhaltens der List
Schlüssel:
Apfel Ein weiterer Hallo
Das Ergebnis des Erhaltens der List
Werte:
3.14 Element Welt
HashMap
und ähnliche nicht sortierte Map
Implementierungen effektiv zufällig ist.
Verwenden der Java 8 Streams-API.
List<Value> values = map.values().stream().collect(Collectors.toList());
eine Liste von was?
Angenommen, es map
ist Ihre Instanz vonMap
map.values()
gibt ein zurück, Collection
das alle Werte der Karte enthält.map.keySet()
gibt ein zurück, Set
das alle Schlüssel der Karte enthält.Ich denke , Sie wollen die Werte in den enthaltenen umwandeln Map
zu ein list
? Am einfachsten ist es, die values()
Methode der Map
Schnittstelle aufzurufen . Dies gibt die Collection
Wertobjekte zurück, die in derMap
. .
Beachten Sie, dass dies Collection
vom Map
Objekt unterstützt wird und alle Änderungen am Map
Objekt hier berücksichtigt werden. Wenn Sie also eine separate Kopie wünschen, die nicht an Ihr Map
Objekt gebunden ist , erstellen Sie einfach ein neues List
Objekt, ArrayList
indem Sie den folgenden Wert übergeben Collection
.
ArrayList<String> list = new ArrayList<String>(map.values());
Sie können es so machen
List<Value> list = new ArrayList<Value>(map.values());
Wenn Sie sicherstellen möchten, dass die Werte in der Resultierenden List<Value>
in der Schlüsselreihenfolge der Eingabe sind Map<Key, Value>
, müssen Sie "über" gehen.SortedMap
irgendwie .
Beginnen Sie entweder mit einer konkreten SortedMap
Implementierung (z. B. TreeMap
) oder fügen Sie Ihre Eingabe Map
in eine ein, SortedMap
bevor Sie diese in konvertieren List
. z.B:
Map<Key,Value> map;
List<Value> list = new ArrayList<Value>( new TreeMap<Key Value>( map ));
Andernfalls erhalten Sie die native Reihenfolge, die die Map
Implementierung bietet. Dies kann häufig etwas anderes sein als die natürliche Schlüsselreihenfolge (Try Hashtable
or ConcurrentHashMap
, für Abwechslung).
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("java", 20);
map.put("C++", 45);
Set <Entry<String, Integer>> set = map.entrySet();
List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set);
Wir können sowohl Schlüssel- als auch Wertepaare in der Liste haben. Sie können auch Schlüssel und Wert mit Map.Entry erhalten, indem Sie über die Liste iterieren.
// you can use this
List<Value> list = new ArrayList<Value>(map.values());
// or you may use
List<Value> list = new ArrayList<Value>();
for (Map.Entry<String, String> entry : map.entrySet())
{
list.add(entry.getValue());
}
"Map<String , String > map = new HapshMap<String , String>;
map.add("one","java");
map.add("two" ,"spring");
Set<Entry<String,String>> set = map.entrySet();
List<Entry<String , String>> list = new ArrayList<Entry<String , String>> (set);
for(Entry<String , String> entry : list ) {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
} "
Hier ist die generische Methode zum Abrufen von Werten aus der Karte.
public static <T> List<T> ValueListFromMap(HashMap<String, T> map) {
List<T> thingList = new ArrayList<>();
for (Map.Entry<String, T> entry : map.entrySet()) {
thingList.add(entry.getValue());
}
return thingList;
}
HashMap<Integer, List<String>> map = new HashMap<>();
List<String> list = new ArrayList<String>();
list.add("Java");
list.add("Primefaces");
list.add("JSF");
map.put(1,list);
if(map != null){
return new ArrayList<String>((Collection<? extends String>) map.values());
}