Научитесь работать с 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, как правило, потребляют много памяти. Заполнение карты еще большим количеством карт только усугубит проблему потребления памяти. Поэтому мы должны быть осторожны при ее использовании, и она будет использоваться в особых сценариях, где это действительно необходимо.
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. Заключение
Мы изучили вложенные карты и то, как их создавать, добавлять, удалять и перебирать элементы. Мы также увидели, где можно использовать вложенные карты.