Iteracja przez Hashmapę [duplikat]
Możliwy duplikat:
jak sprawnie iterować każdy wpis na "mapie"?
Jaki jest najlepszy sposób na iterację elementów w HashMap
?
7 answers
Iterować przez entrySet()
Tak:
public static void printMap(Map mp) {
Iterator it = mp.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
System.out.println(pair.getKey() + " = " + pair.getValue());
it.remove(); // avoids a ConcurrentModificationException
}
}
Czytaj więcej o Map
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-20 16:56:35
Jeśli interesują Cię tylko klucze, możesz to zrobić poprzez keySet()
z mapy:
Map<String, Object> map = ...;
for (String key : map.keySet()) {
// ...
}
Jeśli potrzebujesz tylko wartości, użyj values()
:
for (Object value : map.values()) {
// ...
}
Na koniec, jeśli chcesz mieć zarówno klucz, jak i wartość, użyj entrySet()
:
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
// ...
}
Jedno zastrzeżenie: jeśli chcesz usunąć elementy w połowie iteracji, musisz to zrobić za pomocą iteratora(zobacz odpowiedź karim79 ). Jednak zmiana wartości elementów jest OK (zobacz Map.Entry
).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:51
Jak iterować po mapie w Javie:
Istnieje kilka sposobów iteracji Map
w Javie. Przejdźmy do najczęstszych metod i przeglądu ich zalet i wad. Ponieważ wszystkie mapy w Javie implementują interfejs mapy, następujące techniki będą działać dla każdej implementacji map(HashMap
, TreeMap
, LinkedHashMap
, Hashtable
, itd.)
Metoda # 1: iteracja nad wpisami za pomocą for-Each pętla.
Jest to najczęstsza metoda i jest preferowana w większości przypadków. Powinien być używany, jeśli potrzebujesz zarówno kluczy map, jak i wartości w pętli.
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
Zauważ, że pętla For-Each została wprowadzona w Javie 5, więc ta metoda działa tylko w nowszych wersjach języka. Również pętla For-Each rzuci NullPointerException
, jeśli spróbujesz iterować nad mapą, która jest null, więc przed iteracją zawsze powinieneś sprawdzić, czy nie ma referencji null.
Metoda # 2 : iteracja nad kluczami lub wartości za pomocą pętli For-Each.
Jeśli potrzebujesz tylko kluczy lub wartości z mapy, możesz iterację nad zestawem kluczy lub wartościami zamiast entrySet.
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
// Iterating over keys only
for (Integer key : map.keySet()) {
System.out.println("Key = " + key);
}
// Iterating over values only
for (Integer value : map.values()) {
System.out.println("Value = " + value);
}
Ta metoda daje niewielką przewagę nad iteracją entrySet
(o 10% szybszą) i jest bardziej czysta.
Metoda # 3 : iteracja przy użyciu iteratora.
Użycie Generyków:
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
BEZ Generyków:
Map map = new HashMap();
Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Integer key = (Integer)entry.getKey();
Integer value = (Integer)entry.getValue();
System.out.println("Key = " + key + ", Value = " + value);
}
Możesz również użyć tej samej techniki do iteracji keySet
lub wartości.
Ta metoda może wyglądać na zbędną, ale ma swoje zalety. Po pierwsze, jest to jedyny sposób na iterację mapy w starszych wersjach Javy. Inną ważną cechą jest to, że jest to jedyna metoda, która pozwala usunąć wpisy z mapy podczas iteracji przez wywołanie iterator.remove()
. Jeśli spróbujesz to zrobić podczas każdej iteracji For, otrzymasz "nieprzewidywalne wyniki" zgodnie z Javadoc.
Z punktu widzenia wydajności metoda ta jest równa za-każda iteracja.
Metoda # 4 : iteracja nad kluczami i wyszukiwanie wartości (nieefektywne).
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer key : map.keySet()) {
Integer value = map.get(key);
System.out.println("Key = " + key + ", Value = " + value);
}
Może to wyglądać na czystszą alternatywę dla metody #1, ale w praktyce jest to dość powolne i nieefektywne, ponieważ pobieranie wartości przez klucz może być czasochłonne(ta metoda w różnych implementacjach Map jest o 20% -200% wolniejsza niż metoda # 1). Jeśli masz zainstalowany program FindBugs, wykryje to i ostrzeże Cię o nieefektywnej iteracji. Metoda ta powinna być / align = "left" /
Wniosek:
Jeśli potrzebujesz tylko kluczy lub wartości z mapy, użyj metody # 2. Jeśli utkniesz ze starszą wersją Javy (mniej niż 5) lub planujesz usunąć wpisy podczas iteracji, musisz użyć metody # 3. W przeciwnym razie użyj metody #1.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-06 19:33:03
for (Map.Entry<String, String> item : params.entrySet()) {
String key = item.getKey();
String value = item.getValue();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-20 16:52:35
Możesz iterować poprzez wpisy w Map
na kilka sposobów. Get each key and value like this:
Map<?,?> map = new HashMap<Object, Object>();
for(Entry<?, ?> e: map.entrySet()){
System.out.println("Key " + e.getKey());
System.out.println("Value " + e.getValue());
}
Lub możesz uzyskać listę kluczy za pomocą
Collection<?> keys = map.keySet();
for(Object key: keys){
System.out.println("Key " + key);
System.out.println("Value " + map.get(key));
}
Jeśli po prostu chcesz uzyskać wszystkie wartości i nie jesteś zainteresowany kluczami, możesz użyć:
Collection<?> values = map.values();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-20 16:52:15
Mądrzejszy:
for (String key : hashMap.keySet()) {
System.out.println("Key: " + key + ", Value: " + map.get(key));
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-11 10:01:04
Zależy. Jeśli wiesz, że będziesz potrzebował zarówno klucza, jak i wartości każdego wpisu, przejdź przez entrySet
. Jeśli potrzebujesz tylko wartości, to istnieje metoda values()
. A jeśli potrzebujesz tylko kluczy, użyj keyset()
.
Złą praktyką byłoby iterację przez wszystkie klucze, a następnie w pętli zawsze rób map.get(key)
, aby uzyskać wartość. Jeśli to robisz, to pierwsza opcja, którą napisałem jest dla Ciebie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-27 17:42:25