Зарегистрируйтесь, чтобы продолжить обучение

Обход Map Java: Maps

Обход 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, реализацию, которая запоминает порядок добавления элементов и использует его при обходе.


Дополнительные материалы

  1. Интерфейс Map.Entry, представляющий пару ключ-значение

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff