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;
Collection
do List
zadział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 Map
ma dwie wartości (klucz i wartość), podczas gdy List
tylko jedna ma wartość (element).
Dlatego najlepsze, co można zrobić, to uzyskać jeden List
z 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 List
można uzyskać, tworząc nowy ArrayList
ze Set
zwracanego przez Map.keySet
metodę:
List<String> list = new ArrayList<String>(m.keySet());
Podczas gdy wartości jako List
można uzyskać, tworząc nowy ArrayList
ze Collection
zwracanego przez Map.values
metodę:
List<String> list = new ArrayList<String>(m.values());
Wynik uzyskania List
kluczy:
jabłko Inne Witaj
Wynik uzyskania List
wartości:
3.14 Element Świat
HashMap
podobnych nieposortowanych Map
implementacji 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.Entry
obiektó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 map
masz instancjęMap
map.values()
zwróci wartość Collection
zawierającą wszystkie wartości mapy.map.keySet()
zwróci Set
zawierające wszystkie klucze mapy.Chyba chcesz przekonwertować wartości zawartych w Map
Do list
? Najłatwiej jest wywołać values()
metodę Map
interfejsu. Zwróci to Collection
wartości obiektów zawartych w Map
.
Zauważ, że Collection
jest to wspierane przez Map
obiekt, a wszelkie zmiany w Map
obiekcie odzwierciedlą się tutaj. Jeśli więc chcesz, aby oddzielna kopia nie była związana z Twoim Map
obiektem, po prostu utwórz nowy List
obiekt, na przykład ArrayList
przekazując wartość, Collection
jak 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 SortedMap
jakoś „przejść przez” .
Albo zacząć z konkretną SortedMap
realizację (np TreeMap
) lub włóż wkład Map
do SortedMap
przed 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ą Map
zapewnia implementacja, która często może być czymś innym niż naturalna kolejność kluczy (spróbuj Hashtable
lub 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());
}