Итерации через HashMap
Возможный дубликат:
Как эффективно перебирать каждую запись на «карте»?
Каков наилучший способ перебора элементов в HashMap
?
- Как пропустить HashMap в JSP?
- Макрос Vba для копирования строки из таблицы, если значение в таблице соответствует условию
- Итерации по двум массивам одновременно в bash
- Как сделать бесконечную анимацию jquery?
- Создание массива из текстового файла в Bash
- JFreechart Loop через сектора полярных диаграмм
- Цикл через каждую строку диапазона в Excel
- jQuery AJAX вызывает цикл
- Расширение ячеек столбцов для каждой ячейки столбца
- Прокрутка файлов в папке в matlab
- Ускорьте работу цикла в R
- использование ярлыков в java без "петель"
- Каков наилучший способ повторного применения сценария к n. CSV-файлам в R?
Итерации через 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
.
Если вас интересуют только ключи, вы можете выполнять итерацию через keySet()
карты:
Map map = ...; for (String key : map.keySet()) { // ... }
Если вам нужны только значения, используйте values()
:
for (Object value : map.values()) { // ... }
Наконец, если вы хотите как ключ, так и значение, используйте entrySet()
:
for (Map.Entry entry : map.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); // ... }
Одно предупреждение: если вы хотите удалить элементы в середине итерации, вам нужно сделать это через Iterator (см . Ответ karim79 ). Однако изменение значений элементов в порядке (см. Map.Entry
).
Извлечение из ссылки Как перебирать карту в Java :
Существует несколько способов итерации по Map
на Java. Давайте рассмотрим наиболее распространенные методы и рассмотрим их преимущества и недостатки. Поскольку все карты в Java реализуют интерфейс Map, следующие методы будут работать для любой реализации карты ( HashMap
, TreeMap
, LinkedHashMap
, Hashtable
и т. Д.),
Метод №1 : Итерирование записей с использованием цикла For-Each.
Это наиболее распространенный метод и предпочтительнее в большинстве случаев. Он должен использоваться, если вам нужны как ключи карты, так и значения в цикле.
Map map = new HashMap(); for (Map.Entry entry : map.entrySet()) { System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); }
Обратите внимание, что цикл For-Every был введен в Java 5, поэтому этот метод работает только в более новых версиях языка. Также цикл For-Each будет генерировать NullPointerException
если вы попытаетесь выполнить итерацию по карте, которая равна null, поэтому перед итерацией вы всегда должны проверять наличие нулевых ссылок.
Метод №2 : Итерирование по клавишам или значениям с использованием цикла For-Each.
Если вам нужны только ключи или значения на карте, вы можете выполнять итерацию по keySet или значениям вместо entrySet.
Map map = new HashMap(); // 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 : Итерация с использованием Итератора.
Использование дженериков:
Map map = new HashMap(); Iterator> entries = map.entrySet().iterator(); while (entries.hasNext()) { Map.Entry 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()
. Если вы попытаетесь сделать это во время каждой итерации, вы получите «непредсказуемые результаты» в соответствии с Javadoc .
С точки зрения производительности этот метод равен Итерации For-Each.
Метод №4 : Итерация по клавишам и поиск значений (неэффективные).
Map map = new HashMap(); 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.
Вы можете перебирать записи в Map
несколькими способами. Получите каждый ключ и оцените следующее:
Map map = new HashMap
Или вы можете получить список ключей с помощью
Collection keys = map.keySet(); for(Object key: keys){ System.out.println("Key " + key); System.out.println("Value " + map.get(key)); }
Если вы просто хотите получить все значения и не связаны с ключами, вы можете использовать:
Collection values = map.values();
for (Map.Entry item : params.entrySet()) { String key = item.getKey(); String value = item.getValue(); }
Smarter:
for (String key : hashMap.keySet()) { System.out.println("Key: " + key + ", Value: " + map.get(key)); }
Зависит. Если вы знаете, что вам понадобятся как ключ, так и значение каждой записи, перейдите через entrySet
. Если вам нужны только значения, то есть метод values()
. И если вам просто нужны ключи, то используйте keyset()
.
Плохая практика заключалась бы в том, чтобы перебирать все ключи, а затем в цикле всегда делать map.get(key)
чтобы получить значение. Если вы это делаете, то первый вариант, который я написал, для вас.