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 Listfunktionieren 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 Mapzwei Werte (ein Schlüssel und ein Wert) vorhanden sind, während a Listnur einen Wert (ein Element) hat.
Daher ist das Beste, was getan werden kann, entweder einen Listder 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 Listkönnen erhalten werden, indem ArrayListaus einem Setvon der Map.keySetMethode zurückgegebenen Schlüssel ein neuer erstellt wird:
List<String> list = new ArrayList<String>(m.keySet());
Während die Werte als erhalten werden Listkönnen, erstellen Sie eine neue ArrayListaus einer Collectionvon der Map.valuesMethode zurückgegebenen:
List<String> list = new ArrayList<String>(m.values());
Das Ergebnis des Erhaltens der ListSchlüssel:
Apfel Ein weiterer Hallo
Das Ergebnis des Erhaltens der ListWerte:
3.14 Element Welt
HashMapund ähnliche nicht sortierte MapImplementierungen 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 mapist Ihre Instanz vonMap
map.values()gibt ein zurück, Collectiondas alle Werte der Karte enthält.map.keySet()gibt ein zurück, Setdas alle Schlüssel der Karte enthält.Ich denke , Sie wollen die Werte in den enthaltenen umwandeln Mapzu ein list? Am einfachsten ist es, die values()Methode der MapSchnittstelle aufzurufen . Dies gibt die CollectionWertobjekte zurück, die in derMap . .
Beachten Sie, dass dies Collectionvom MapObjekt unterstützt wird und alle Änderungen am MapObjekt hier berücksichtigt werden. Wenn Sie also eine separate Kopie wünschen, die nicht an Ihr MapObjekt gebunden ist , erstellen Sie einfach ein neues ListObjekt, ArrayListindem 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 SortedMapImplementierung (z. B. TreeMap) oder fügen Sie Ihre Eingabe Mapin eine ein, SortedMapbevor 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 MapImplementierung bietet. Dies kann häufig etwas anderes sein als die natürliche Schlüsselreihenfolge (Try Hashtableor 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());
}