Обход HashMap
не самая частая операция, но иногда встречается. В отличие от списков, где обход это просто перебор элементов списка, обход HashMap
может включать в себя обход пар ключ-значения, обход ключей и значений по отдельности. Всего есть два основных подхода к этим обходам:
- С помощью метода
forEach()
. Понимание этого способа требует знакомства с lambda-функциями, которые будут изучаться позже. - С помощью преобразования
HashMap
в коллекцию, которая работает с for-each. Этот подход включает в себя три разных варианта: обход пар ключ-значения (entrySet()
), обход значенийvalues()
и обход ключейkeySet()
.
Обход значений
Обход значений в HashMap
выполняется по коллекции, полученной с помощью метода values()
:
var codes = new HashMap<String, Integer>();
codes.put("usa", 1);
codes.put("france", 33);
codes.put("germany", 49);
var values = codes.values(); // Получаем значения
for (var value : values) {
System.out.println(value);
}
// => 1
// => 49
// => 33
Обход ключей
Для обхода ключей их нужно получить с помощью метода keySet()
. Этот метод возвращает коллекцию типа Set
, которая отличается от List
тем, что значения внутри этой коллекции уникальны. С точки зрения обхода ничего не меняется:
var codes = new HashMap<String, Integer>();
codes.put("usa", 1);
codes.put("france", 33);
codes.put("germany", 49);
var keys = codes.keySet();
for (var key : keys) {
System.out.println(key);
var value = codes.get(key);
System.out.println(value);
}
// => usa
// =>1
// => germany
// => 49
// => france
// => 33
Как бонус, имея на руках ключ, мы можем достать значение из Map
.
Обход пар ключ-значение
Если нам одновременно нужны ключ и значение, то можно воспользоваться методом entrySet()
, который возвращает пару ключ-значение в виде объекта для удобного доступа:
var codes = new HashMap<String, Integer>();
codes.put("usa", 1);
codes.put("france", 33);
codes.put("germany", 49);
var entries = codes.entrySet();
for (var entry : entries) {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
// => usa
// =>1
// => germany
// => 49
// => france
// => 33
Использование forEach
Самый удобный способ выполнить обход ключей и значений — это использование метода forEach()
. Ниже будет пример аналогичный примеру выше, но не сильно заморачивайтесь если вы до конца не поняли этот пример. Подробно лямбда-функции изучаются в одном из следующих курсов:
var codes = new HashMap<String, Integer>();
codes.put("usa", 1);
codes.put("france", 33);
codes.put("germany", 49);
codes.forEach((key, value) -> {
System.out.println(key);
System.out.println(value);
});
Но независимо от способа обхода, важно учитывать то, что HashMap
не является последовательной структурой как ArrayList
. Порядок добавления элементов не влияет на их порядок обхода. Порядок обхода зависит от того, как данные хранятся внутри, что невозможно предсказать. Поэтому работая с HashMap
нельзя опираться на порядок.
Если порядок все же нужен, то вместо HashMap
можно использовать LinkedHashMap
, реализацию, которая запоминает порядок добавления элементов и использует его при обходе.
Дополнительные материалы
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.