Вложенная карта Java с примерами

Научитесь работать с Nested HashMap в Java. От создания, удаления и итерации элементов, мы также увидим практические варианты использования, где мы можем использовать вложенные карты.

1. Введение

Класс HashMap расширяет класс AbstractMap и реализует интерфейс Map. Он содержит объекты записи, т.е. пары ключ-значение. Ключи или значения имеют типы Object.

Вложенный HashMap — это Map внутри Map. Единственное различие между HashMap и вложенным HashMap:

  • Для HashMap ключ или значение могут быть любого типа(объект).
  • Для вложенного HashMap ключ может быть любого типа(объект), но значением может быть только другой объект HashMap.

Обратите внимание на вложенную HashMap, созданную ниже. Мы создаем HashMap, имея «String» в качестве ключа и еще одну «HashMap» в качестве значения для этой карты, и это то, что мы называем вложенной HashMap.

// Creating Nested HashMapMap<String, HashMap<Integer, String>> nestedMap = new HashMap<>();

2. Когда следует использовать вложенную карту?

Мы используем вложенные карты, когда нам нужны вложенные объекты, т.е. объекты внутри объекта. Давайте возьмем пример структуры данных JSON, где у нас есть вложенные объекты внутри других объектов.

{"Alex": {"Hideout": "UAE","Permanent": "Florida","Postal": "Canada"},"Brian": {"Hideout": "India","Permanent": "Alaska","Postal": "Canada"}}

Вложенные карты трудно масштабировать, что затрудняет чтение кода(читабельность кода). Что еще важнее, карты в Java, как правило, потребляют много памяти. Заполнение карты еще большим количеством карт только усугубит проблему потребления памяти. Поэтому мы должны быть осторожны при ее использовании, и она будет использоваться в особых сценариях, где это действительно необходимо.

Как работает HashMap?

3. Работа с вложенной HashMap

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

3.1 Создание вложенной карты с помощью Map.put()

Мы можем использовать метод put() интерфейса Map для добавления элементов как во внешний, так и во внутренний HashMap.

Map<String, Map<String, String>> employeeMap = new HashMap<>();Map<String, String> addressMap = new HashMap<>();addressMap.put("Permanent", "Florida");addressMap.put("Postal", "Canada");employeeMap.put("Alex", addressMap);

3.2 Создание вложенной карты с использованием потоков

Мы можем использовать stream api для создания вложенных карт с помощью метода Collectors.toMap(). В следующем примере мы создаем класс 'Student', имеющий 'studentId' и другие поля.

class Student{private Integer studentId;private String studentName;private String course;// Getters & Setters}

У нас есть список объектов Student, и из этого списка мы создаем вложенную карту, имеющую ключ «studentId» и значение в виде другой карты с ключом studentName и значением в виде курса.

// Creating Nested MapList<Student> studentList = List.of(new Student(1, "A", "Course1"),new Student(2, "B", "Course2"),new Student(3, "C", "Course3"));Map<Integer, Map<String, String>> studentNestedMap =studentList.stream().collect(Collectors.groupingBy(s -> s.getStudentId(),Collectors.toMap(Student::getStudentName, Student::getCourse)));

3.3 Добавление элемента во вложенную карту

Мы можем добавлять новые элементы в существующую вложенную карту, сначала извлекая вложенную карту из внешней карты, а затем используя метод put() для добавления новых элементов во внутреннюю карту.

Map<String, Map<String, String>> employeeMap = new HashMap<>();//Adding another address for AlexemployeeMap.get("Alex").put("Hideout", "UAE");

3.4 Удаление элемента из вложенной карты

Чтобы удалить элементы из вложенного HashMap, вызовите remove(), как в предыдущем примере.

Map<String, Map<String, String>> employeeMap = new HashMap<>();//Hideout has been exposed so removing itemployeeMap.get("Alex").remove("Hideout");

3.5 Итерация по вложенному HashMap

Мы можем выполнять итерацию по вложенной карте так же, как мы делаем это с обычной HashMap.

Map<String, Map<String, String>> employeeMap = new HashMap<>();for(Map.Entry<String, Map<String, String>> empMap : employeeMap.entrySet()) {Map<String, String> addMap = empMap.getValue();// Iterate InnerMapfor(Map.Entry<String, String> addressSet : addMap.entrySet()) {System.out.println(addressSet.getKey() + " :: " + addressSet.getValue());}}

4. Заключение

Мы изучили вложенные карты и то, как их создавать, добавлять, удалять и перебирать элементы. Мы также увидели, где можно использовать вложенные карты.

Исходный код на Github

Прокрутить вверх