Как с помощью fori пройтись по HashMap?
Как-то так. Но здесь создается лишний List, поэтому если вам просто нужен индекс, то добавьте соот. переменную и инкрементируйте ее в цикле.
List keys = new ArrayList(map.keySet()); for(int i = 0; i
Отслеживать
ответ дан 22 фев 2016 в 14:26
4,089 1 1 золотой знак 10 10 серебряных знаков 22 22 бронзовых знака
int i = 0; for (Map.Entry entry : map.entrySet()) < System.out.println(i + " " + entry.getKey() + " " + entry.getValue()); ++i; //iterate >
Iterator> iterator = map.entrySet().iterator(); for (int i = 0; ; ++i) < if(iterator.hasNext()) < Map.Entryentry = iterator.next(); System.out.println(i + " " + entry.getKey() + " " + entry.getValue()); > else break; >
Перебрать карту в Java
В этом кратком руководстве мы рассмотрим различные способы перебора записей Map в Java.
Проще говоря, мы можем извлечь содержимое карты с помощью entrySet() , keySet() или values() . Поскольку это все наборы, ко всем из них применяются одинаковые принципы итерации.
Давайте подробнее рассмотрим некоторые из них.
2. Краткое введение в методы Map entrySet (), keySet() и values()
Прежде чем мы перейдем к карте, используя три метода, давайте разберемся, что эти методы делают:
- entrySet() – возвращает коллекцию-представление карты, элементы которой взяты из класса Map.Entry . Метод entry.getKey() возвращает ключ, а entry.getValue() возвращает соответствующее значение.
- keySet () — возвращает все ключи, содержащиеся в этой карте, в виде набора
- values () — возвращает все значения, содержащиеся в этой карте, в виде набора
Далее давайте посмотрим на эти методы в действии.
3. Использование цикла for
3.1. Использование набора записей()
Во-первых, давайте посмотрим, как перебирать Map с помощью Entry Set :
public void iterateUsingEntrySet(MapString, Integer> map) for (Map.EntryString, Integer> entry : map.entrySet()) System.out.println(entry.getKey() + ":" + entry.getValue()); > >
Здесь мы извлекаем множество записей из нашей карты , а затем перебираем их, используя классический подход для каждого.
3.2. Использование набора ключей()
В качестве альтернативы мы можем сначала получить все ключи в нашей карте с помощью метода keySet , а затем перебрать карту по каждому ключу:
public void iterateUsingKeySetAndForeach(MapString, Integer> map) for (String key : map.keySet()) System.out.println(key + ":" + map.get(key)); > >
3.3. Перебор значений с использованием values()
Иногда нас интересуют только значения на карте, независимо от того, какие ключи с ними связаны . В этом случае values() — наш лучший выбор:
public void iterateValues(MapString, Integer> map) for (Integer value : map.values()) System.out.println(value); > >
4. Итератор
Другой подход к выполнению итерации — использование Iterator . Далее давайте посмотрим, как методы работают с объектом Iterator .
4.1. Итератор и entrySet()
Во-первых, давайте пройдемся по карте, используя Iterator и entrySet() :
public void iterateUsingIteratorAndEntry(MapString, Integer> map) IteratorMap.EntryString, Integer>> iterator = map.entrySet().iterator(); while (iterator.hasNext()) Map.EntryString, Integer> entry = iterator.next(); System.out.println(entry.getKey() + ":" + entry.getValue()); > >
Обратите внимание, как мы можем получить экземпляр Iterator , используя API iterator() набора , возвращаемого entrySet(). Затем, как обычно, мы перебираем итератор с помощью iterator.next().
4.2. Итератор и keySet()
Точно так же мы можем перебирать карту с помощью Iterator и keySet() :
public void iterateUsingIteratorAndKeySet(MapString, Integer> map) IteratorString> iterator = map.keySet().iterator(); while (iterator.hasNext()) String key = iterator.next(); System.out.println(key + ":" + map.get(key)); > >
4.3. Итератор и значения()
Мы также можем пройтись по значениям карты, используя итератор и метод values() :
public void iterateUsingIteratorAndValues(MapString, Integer> map) IteratorInteger> iterator = map.values().iterator(); while (iterator.hasNext()) Integer value = iterator.next(); System.out.println("value :" + value); > >
5. Использование Lambdas и Stream API
Начиная с версии 8, Java представила Stream API и лямбда-выражения. Далее давайте посмотрим, как итерировать карту, используя эти методы.
5.1. Использование forEach() и Lambda
Как и большинство других вещей в Java 8, это оказалось намного проще, чем альтернативы. Мы просто воспользуемся методом forEach() :
public void iterateUsingLambda(MapString, Integer> map) map.forEach((k, v) -> System.out.println((k + ":" + v))); >
В этом случае нам не нужно преобразовывать карту в набор записей. Чтобы узнать больше о лямбда-выражениях, мы можем начать здесь .
Мы можем, конечно, начать с ключей, чтобы перебрать карту:
public void iterateByKeysUsingLambda(MapString, Integer> map) map.keySet().foreach(k -> System.out.println((k + ":" + map.get(k)))); >
Точно так же мы можем использовать ту же технику с методом values() :
public void iterateValuesUsingLambda(MapString, Integer> map) map.values().forEach(v -> System.out.println(("value: " + v))); >
5.2. Использование потокового API
Stream API — одна из важных функций Java 8. Мы также можем использовать эту функцию для циклического просмотра карты .
Stream API следует использовать, когда мы планируем выполнять дополнительную обработку Stream ; в противном случае это просто forEach() , как описано ранее.
Давайте возьмем entrySet() в качестве примера, чтобы увидеть, как работает Stream API:
public void iterateUsingStreamAPI(MapString, Integer> map) map.entrySet().stream() // . some other Stream processings .forEach(e -> System.out.println(e.getKey() + ":" + e.getValue())); >
Использование Stream API с методами keySet() и values() будет очень похоже на пример выше.
6. Заключение
В этой статье мы сосредоточились на критической, но простой операции: переборе элементов карты .
Мы рассмотрели несколько методов, которые можно использовать только с Java 8+, а именно лямбда-выражения и Stream API.
Как всегда, примеры кода в этой статье можно найти на GitHub .
- 1. Обзор
- 2. Краткое введение в методы Map entrySet (), keySet() и values()
- 3. Использование цикла for
- 3.1. Использование набора записей()
- 3.2. Использование набора ключей()
- 3.3. Перебор значений с использованием values()
- 4.1. Итератор и entrySet()
- 4.2. Итератор и keySet()
- 4.3. Итератор и значения()
- 5.1. Использование forEach() и Lambda
- 5.2. Использование потокового API
Перебор элементов коллекции Map
В библиотеке Java предусмотрены две основные реализации словарей (карт): хэш-карта HashMap и карта-дерево ТгееМар. Оба эти класса реализуют интерфейс Map, который не наследует интерфейс Collection, но является неотъемлемой частью коллекций. Все интерфейсы фреймворка находятся в пакете java.util.
В хэш-карте ключи расположены случайным образом, а в карте-дереве — в строгом порядке. Хэш-функция, или функция сравнения, применяется только для ключей, а сами значения, соответствующие этим ключам, не хэшируются и не сравниваются.
Проход по каждой паре ключ-значение — самая базовая, основная процедура прохода по Map. В Java, каждая пара хранится в поле Map называемом Map.Entry. Map.entrySet() возвращает набор ключей-значений, потому самым эффективным способом пройтись по всем значениям Map будет:
for (Map.Entry entry: hashmap.entrySet()) System.out.println(entry.getKey() + " = " + entry.getValue());
Так же мы можем использовать Iterator — интерфейс, для организации цикла для перебора коллекций.
// hasNext() проверяет есть ли ещё элементы // next() возвращает очередной элемент Iterator> itr = hashmap.entrySet().iterator(); while (itr.hasNext()) System.out.println(itr.next());
Можно пробежаться по ключам:
// keySet возвращает множество ключей for (String key: map.keySet()) System.out.println(map.get(key));
Как пройтись по map java
Проверьте, пожалуйста, код в разделе «3. Как отсортировать значения мапы», в нём надо переименовать переменную.
Dmytryi Shubchynskyi Уровень 108 Expert
22 февраля 2022
для чего нужно Создание неизменяемой (immutable) пустой мапы ?
Sergey Kornilov Уровень 39
5 июля 2021
В закладки.
Иван Уровень 41
8 января 2021Так же есть ошибка в пункте 4, подпункт 3, где говорится про потокобезопасность HashTable. В тексте нужно поменять местами HashMap и HashTable и тогда таблица будет верно читаться.
Yuliia Boklah Уровень 41
6 сентября 2020В свою очередь, TreeMap гарантирует хранение элементов в порядке добавления или же в соответствии с заданным компаратором. Указана совершенно неправильная информация. Речь идет об LinkedHashMap. В TreeMap элементы хранятся в есттественном порядке (natural ordering) или же в соответствии с заданным компаратором. Исправьте ошибку и не вводите учеников в заблуждение.