Вопрос-ответ

Iterate through a HashMap [duplicate]

Выполнение итерации по хэш-карте

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

Переведено автоматически
Ответ 1

Если вас интересуют только ключи, вы можете выполнить итерацию по 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).

Ответ 2

Выполнить итерацию по 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.

Ответ 3

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

В Java существует несколько способов итерации по a Map. Давайте рассмотрим наиболее распространенные методы и рассмотрим их преимущества и недостатки. Поскольку все карты в Java реализуют интерфейс Map, следующие методы будут работать для любой реализации 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 если вы попытаетесь выполнить итерацию по карте, имеющей значение null, поэтому перед выполнением итерации вы всегда должны проверять наличие нулевых ссылок.

Метод № 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.

Использование обобщений:

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 значениям or.

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

С точки зрения производительности этот метод равен Для каждой итерации.

Метод №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.

Ответ 4
for (Map.Entry<String, String> item : hashMap.entrySet()) {
String key = item.getKey();
String value = item.getValue();
}
java