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?

Author: Peter Mortensen, 2009-07-01

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.

 2884
Author: karim79,
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).

 4194
Author: harto,
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.

 751
Author: arvind,
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();
}
 84
Author: gabor,
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();
 82
Author: codethulhu,
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));
}
 57
Author: jkarretero,
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.

 42
Author: Gary Kephart,
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