Jaki jest najlepszy sposób na konwersję Map<key,value>na a List<value>? Wystarczy powtórzyć wszystkie wartości i wstawić je do listy, czy coś przeoczyłem?
Jaki jest najlepszy sposób na konwersję Map<key,value>na a List<value>? Wystarczy powtórzyć wszystkie wartości i wstawić je do listy, czy coś przeoczyłem?
Odpowiedzi:
List<Value> list = new ArrayList<Value>(map.values());
zarozumiały:
Map<Key,Value> map;
Collectiondo Listzadziała.
keySet()i values()są ogólnie shim obiektami, które dają widok zestawu lub kolekcji podstawowej struktury ( keySet()zwraca zestaw, aby podkreślić brak duplikatów). Bo values()zwrócony obiekt może być List, ale często nie będzie. Tworzenie prawdziwej listy, jak mówisz, przerywa link, co oznacza, że nie jesteś już zależny od oryginalnej mapy. Czasami jednak potrzebujesz tylko Listy, ponieważ niektóre API jej wymagają - wzmacniając zasadę, że dobry API powinien wymagać tylko najbardziej abstrakcyjnych interfejsów, z
Problem polega na tym, że Mapma dwie wartości (klucz i wartość), podczas gdy Listtylko jedna ma wartość (element).
Dlatego najlepsze, co można zrobić, to uzyskać jeden Listz kluczy lub wartości. (Chyba że stworzymy opakowanie, aby utrzymać parę klucz / wartość).
Powiedzmy, że mamy Map:
Map<String, String> m = new HashMap<String, String>();
m.put("Hello", "World");
m.put("Apple", "3.14");
m.put("Another", "Element");
Klucze jako Listmożna uzyskać, tworząc nowy ArrayListze Setzwracanego przez Map.keySetmetodę:
List<String> list = new ArrayList<String>(m.keySet());
Podczas gdy wartości jako Listmożna uzyskać, tworząc nowy ArrayListze Collectionzwracanego przez Map.valuesmetodę:
List<String> list = new ArrayList<String>(m.values());
Wynik uzyskania Listkluczy:
jabłko Inne Witaj
Wynik uzyskania Listwartości:
3.14 Element Świat
HashMappodobnych nieposortowanych Mapimplementacji będzie ona skutecznie losowa.
Korzystanie z interfejsu API strumieni Java 8.
List<Value> values = map.values().stream().collect(Collectors.toList());
map.entrySet()daje kolekcję Map.Entryobiektów zawierających zarówno klucz, jak i wartość. możesz następnie przekształcić to w dowolny obiekt kolekcji, taki jak new ArrayList(map.entrySet());
lista czego?
Zakładając, że mapmasz instancjęMap
map.values()zwróci wartość Collectionzawierającą wszystkie wartości mapy.map.keySet()zwróci Setzawierające wszystkie klucze mapy.Chyba chcesz przekonwertować wartości zawartych w MapDo list? Najłatwiej jest wywołać values()metodę Mapinterfejsu. Zwróci to Collectionwartości obiektów zawartych w Map.
Zauważ, że Collectionjest to wspierane przez Mapobiekt, a wszelkie zmiany w Mapobiekcie odzwierciedlą się tutaj. Jeśli więc chcesz, aby oddzielna kopia nie była związana z Twoim Mapobiektem, po prostu utwórz nowy Listobiekt, na przykład ArrayListprzekazując wartość, Collectionjak poniżej.
ArrayList<String> list = new ArrayList<String>(map.values());
Możesz to zrobić w ten sposób
List<Value> list = new ArrayList<Value>(map.values());
Jeśli chcesz się upewnić, że wartości w wynikowym List<Value>są w kolejności wprowadzania danych wejściowych Map<Key, Value>, musisz SortedMapjakoś „przejść przez” .
Albo zacząć z konkretną SortedMaprealizację (np TreeMap) lub włóż wkład Mapdo SortedMapprzed konwersją, że do List. na przykład:
Map<Key,Value> map;
List<Value> list = new ArrayList<Value>( new TreeMap<Key Value>( map ));
W przeciwnym razie otrzymasz dowolną natywną kolejność, jaką Mapzapewnia implementacja, która często może być czymś innym niż naturalna kolejność kluczy (spróbuj Hashtablelub ConcurrentHashMap, dla odmiany).
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);
możemy mieć parę kluczy i wartości na liście. Możemy również uzyskać klucz i wartość za pomocą Map.Entry poprzez iterację po liście.
// 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());
} "
Oto ogólna metoda uzyskiwania wartości z mapy.
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());
}