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

Мапы Java: Коллекции

Видео может быть заблокировано из-за расширений браузера. В статье вы найдете решение этой проблемы.

Map — это интерфейс, который предоставляет методы для работы со структурой данных, которая содержит в себе набор пар “ключ-значение”. Самая используемая реализация этого интерфейса — Hashmap

Предположим, нам нужно хранить список автомобилей с их номерами. Можно попробовать сделать это при помощи списка List

// Метод возвращает заполненный список автомобилей
// в заданном формате: [госномер номер]:[марка автомобиля]

private static List<String> getCarsList() {
    // создаем список строк
    List<String> cars = new ArrayList<>();
    // добавляем элементы в список
    cars.add("O023TO198:Volvo");
    cars.add("O025XE777:Nissan");
    cars.add("O001OO777:BMW");
    return cars;
}

// Получили список строк
var cars = getCarsList();
// => [O023TO198:Volvo, O025XE777:Nissan, O001OO777:BMW]

// Проблематика: как теперь по номеру машины найти модель автомобиля
// Можно сделать это, полностью перебрав список

// Метод ищет автомобиль по его номеру в списке автомобилей
private static String getModelByPlateNumber(String plateNumber) {
    // перебираем элементы списка
    for (String car : getCarsList()) {
        // метод split помещает элементы строки, разделенные строкой
        // (в нашем случае - : ) в строчный массив
        String[] modelAndPlateNumber = car.split(":");
        // проверяем, номер элемента списка совпадает
        // с переданным значением в качестве аргумента
        if (modelAndPlateNumber[0].equals(plateNumber)) {
            // возвращаем модель авто и прекращаем выполнение метода
            return modelAndPlateNumber[1];
        }
    }
    return null;
}

Вместо этого можно использовать одну из реализаций – HashMap, которая позволяет хранить пары ключей и значений.

// Создаем новый экземпляр
Map<String, String> cars = new HashMap<>();

// метод put() добавляет в словарь пару ключ-значение
cars.put("O023TO198", "Volvo");
cars.put("O025XE777", "Nissan");
cars.put("O001OO777", "BMW");

System.out.println(cars);
// => {O025XE777=Nissan, O001OO777=BMW, O023TO198=Volvo}

// Теперь определить марку автомобиля по его номеру значительно проще
// метод get() возвращает значение по ключу
String modelFromMap = cars.get("O023TO198");
System.out.println(modelFromMap); // "Volvo"
System.out.println(cars.get("O025XE700")); // null

// key может быть null
cars.put(null, "Lada");
System.out.println(cars);
// => {null=Lada, O025XE777=Nissan, O001OO777=BMW, O023TO198=Volvo}

// замена одного значения на другое
cars.put("O025XE777", "Audi");
System.out.println(cars);
// => {null=Lada, O025XE777=Audi, O001OO777=BMW, O023TO198=Volvo}

Базовые операции с Map

Map<String, Integer> people = new HashMap<>();

// Добавление элемента в словарь
people.put("Max", 2006);
people.put("Petr", 1998);
people.put("Ivan", 1981);

System.out.println(people);
// => {Max=2006, Petr=1998, Ivan=1981}
System.out.println("Размер Map: " + people.size());
// => Размер Map: 3

Map<String, Integer> additionalPeopleMap = new HashMap<>();
additionalPeopleMap.put("Vladimir", 1978);
additionalPeopleMap.put("Robert", 2010);
additionalPeopleMap.put("Ibrahim", 2011);

// Метод putAll() копирует все значения из переданного словаря в текущий
people.putAll(additionalPeopleMap);

System.out.println(people);
// => {Ibrahim=2011, Max=2006, Robert=2010, Petr=1998, Ivan=1981, Vladimir=1978}

// Проверка на наличие в словаре ключа
System.out.println(people.containsKey("Max")); // => true

//  и значения
System.out.println(people.containsValue(2021)); // => false

// Удаление элемента из словаря
people.remove("Robert");
System.out.println(people);
// => {Ibrahim=2011, Max=2006, Petr=1998, Ivan=1981, Vladimir=1978}

// Удаление всех элементов
people.clear();
System.out.println(people); // => {}

Map.Entry

Map.Entry – это интерфейс, который позволяет нам получить доступ к записям в словаре

Map<String, String> students = new HashMap<>();
students.put("Max", "Maximov");
students.put("Petr", "Petrov");
students.put("Ivan", "Ivanov");

System.out.println(students.entrySet());
// => [Max=Maximov, Petr=Petrov, Ivan=Ivanov]

// 1 способ получения значения по ключу
// for (String s : students.keySet()) {
//     String lastname = students.get(s);
// }

// 2 cпособ получения значения по ключу - более употребим
for (Map.Entry<String, String> student: students.entrySet()) {
    System.out.println(
        "Student name is = " + student.getKey() + " and student lastname is = " + student.getValue()
    );
}

Вывод на экран:

Student name is = Max and student lastname is = Maximov
Student name is = Petr and student lastname is = Petrov
Student name is = Ivan and student lastname is = Ivanov

Коллекции, реализующие интерфейс Map

// Класс LinkedHashMap

Map<String, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("Egor", "Yakovlev");
linkedHashMap.put("Max", "Maximov");
linkedHashMap.put("Ivan", "Ivanov");

System.out.println(linkedHashMap);
// => {Egor=Yakovlev, Max=Maximov, Ivan=Ivanov}


// Класс TreeMap
Map<Integer, List<String>> treeMap = new TreeMap<>(Comparator.reverseOrder());
treeMap.put(23, List.of("Victor", "Ivan"));
treeMap.put(18, List.of("Eugene"));
treeMap.put(40, List.of("Anna", "Henry", "Igor"));

System.out.println(treeMap);
// => {40=[Anna, Henry, Igor], 23=[Victor, Ivan], 18=[Eugene]}

treeMap.put(35, List.of("Vera"));
System.out.println(treeMap);
// => {40=[Anna, Henry, Igor], 35=[Vera], 23=[Victor, Ivan], 18=[Eugene]}


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

  1. Статья "Структуры данных в картинках"

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

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

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

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

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