Итерация по HashMap [дубликат]

  

Возможный дубликат:
Как эффективно выполнять итерацию по каждой записи в «карте»?

Как лучше всего перебирать элементы в HashMap?

2986 голосов | спросил burntsugar 1 J000000Wednesday09 2009, 03:24:14

7 ответов


0

Итерация по entrySet() вот так:

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
    }
}

Подробнее о Map

ответил karim79 1 J000000Wednesday09 2009, 03:27:25
0

Если вас интересуют только ключи, вы можете перебрать keySet() карты:

Map<String, Object> map = ...;

for (String key : map.keySet()) {
    // ...
}

Если вам нужны только значения, используйте values() :

for (Object value : map.values()) {
    // ...
}

Наконец, если вам нужны ключ и значение, используйте entrySet() :

for (Map.Entry<String, Object> entry : map.entrySet()) {
    String key = entry.getKey();
    Object value = entry.getValue();
    // ...
}

Одно предупреждение: если вы хотите удалить элементы в середине итерации, вам нужно сделать это через итератор (см. ответ karim79 ). Тем не менее, изменение значений элемента в порядке (см. Map.Entry )

.
ответил harto 1 J000000Wednesday09 2009, 03:28:27
0

Извлечено из ссылки Как выполнить итерацию по карте в Java

В Java есть несколько способов перебора Map. Давайте рассмотрим наиболее распространенные методы и рассмотрим их преимущества и недостатки. Поскольку все карты в Java реализуют интерфейс Map, следующие методы будут работать для любой реализации карты (HashMap, TreeMap, LinkedHashMap, Hashtable и т. д.)

Метод # 1 . Итерации по записям с использованием цикла For-Each.

Это наиболее распространенный метод, который предпочтителен в большинстве случаев. Его следует использовать, если вам нужны как ключи карты, так и значения в цикле.

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());
}

Обратите внимание, что цикл For-Each был введен в Java 5, поэтому этот метод работает только в более новых версиях языка. Также цикл For-Each выдаст NullPointerException, если вы попытаетесь выполнить итерацию по карте, которая является нулевой, поэтому перед итерацией всегда следует проверять наличие нулевые ссылки.

Метод # 2 : перебор ключей или значений с использованием цикла For-Each.

Если вам нужны только ключи или значения из карты, вы можете перебирать набор ключей или значения вместо 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);
}

Этот метод дает небольшое преимущество в производительности по сравнению с итерацией entrySet (примерно на 10% быстрее) и является более чистым.

Метод № 3 . Итерация с использованием Iterator.

Использование Generics:

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());
}

Без обобщения:

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);
}

Вы также можете использовать ту же технику, чтобы перебрать keySet или значения.

Этот метод может выглядеть излишним, но у него есть свои преимущества. Прежде всего, это единственный способ перебрать карту в старых версиях Java. Другая важная особенность заключается в том, что это единственный метод, который позволяет удалять записи с карты во время итерации, вызывая iterator.remove(). Если вы попытаетесь сделать это во время итерации For-Each, вы получите «непредсказуемые результаты» в соответствии с Javadoc .

С точки зрения производительности этот метод равен итерации For-Each.

Метод # 4 : перебор ключей и поиск значений (неэффективно).

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);
}

Это может выглядеть как более чистая альтернатива для метода № 1, но на практике это довольно медленно и неэффективно, поскольку получение значений по ключу может занять много времени (этот метод в различных реализациях Map работает на 20% -200% медленнее, чем метод № 1). Если у вас установлен FindBugs, он обнаружит это и предупредит вас о неэффективной итерации. Этого метода следует избегать.

Вывод:

Если вам нужны только ключи или значения с карты, используйте метод № 2. Если вы застряли с более старой версией Java (менее 5) или планируете удалять записи во время итерации, вы должны использовать метод № 3. В противном случае используйте метод # 1.

ответил arvind 8 ThuEurope/Moscow2011-12-08T18:19:20+04:00Europe/Moscow12bEurope/MoscowThu, 08 Dec 2011 18:19:20 +0400 2011, 18:19:20
0
for (Map.Entry<String, String> item : params.entrySet()) {
    String key = item.getKey();
    String value = item.getValue();
}
ответил gabor 23 J000000Saturday11 2011, 05:28:51
0

Вы можете перебирать записи в ---- +: = 0 =: + ---- несколькими способами. Получите каждый ключ и значение следующим образом:

Map

Или вы можете получить список ключей с помощью

Map<?,?> map = new HashMap<Object, Object>();
for(Entry<?, ?> e: map.entrySet()){
    System.out.println("Key " + e.getKey());
    System.out.println("Value " + e.getValue());
}

Если вы просто хотите получить все значения и не интересуетесь ключами, вы можете использовать:

Collection<?> keys = map.keySet();
for(Object key: keys){
    System.out.println("Key " + key);
    System.out.println("Value " + map.get(key));
}
ответил codethulhu 1 J000000Wednesday09 2009, 03:43:21
0

Smarter:

for (String key : hashMap.keySet()) {
    System.out.println("Key: " + key + ", Value: " + map.get(key));
}
ответил jkarretero 11 PM00000020000000431 2010, 14:01:04
0

Зависит. Если вы знаете, что вам понадобится и ключ, и значение каждой записи, перейдите через entrySet. Если вам просто нужны значения, то есть метод values(). А если вам просто нужны ключи, используйте keyset().

Плохой практикой было бы перебирать все ключи, а затем внутри цикла всегда делать map.get(key), чтобы получить значение , Если вы делаете это, то первый вариант, который я написал, для вас.

ответил Gary Kephart 1 J000000Wednesday09 2009, 03:29:10

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132