Итерации через HashMap

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

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

    7 Solutions collect form web for “Итерации через HashMap”

    Итерации через 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(); 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)); } 

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

     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) чтобы получить значение. Если вы это делаете, то первый вариант, который я написал, для вас.

    Interesting Posts

    java.lang.OutOfMemoryError: размер растрового изображения превышает бюджет VM – Android

    Хотите использовать HLOOKUP для перетаскивания всего столбца, как я могу это сделать?

    Linux не будет загружаться из опции в диспетчере загрузки Windows

    Могу ли я использовать косую черту в диалоговом окне открытия файла Windows?

    Как Unix ищет исполняемые файлы?

    Как удалить профиль пользователя на компьютере под управлением Windows 7, который является частью домена?

    Как сделать Notepad ++ открытым каждый файл в новом окне?

    Мой внешний IP-адрес кажется автоматически измененным

    Как получить тип T от члена общего classа или метода?

    Как сделать поиск Google Chrome с помощью google.com, а не google.com.hk?

    Могу ли я создать DVD-диск из папки видео-ts

    Windows 7 застрял на экране загрузки во время установки

    Распространение Anaconda Ошибка Python

    Утилита отключения дисплея ноутбука

    Поддерживает ли устройство, поддерживающее USB 3.0, компьютер, поддерживающий USB 2.0

    Давайте будем гением компьютера.