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]}