学习Java 嵌套地图与实例

346 阅读1分钟

学习如何在Java中 使用嵌套哈希图 从创建、删除和迭代元素,我们还将看到我们可以使用嵌套地图的实际用例。

1.简介

HashMap 类扩展了AbstractMap类并实现了Map接口。它持有条目对象,即键值对。键和值都是对象类型。

嵌套的HashMap是Map中的MapHashMap和嵌套HashMap的唯一区别是。

  • 对于 HashMap,键或值可以是任何类型(对象)。
  • 对于 Nested *HashMap*键可以是任何类型(对象),但值只能是另一个HashMap 对象

注意下面创建的嵌套哈希图;我们创建了一个以*'String'为键,以另一个'HashMap' 为值的哈希图,这就是我们所说的嵌套哈希图

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

2.什么时候使用嵌套地图?

当我们需要嵌套对象时,我们就会使用嵌套地图,也就是对象中的对象。 让我们举一个JSON数据结构的例子,我们有嵌套在其他对象里面的对象。

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

嵌套Maps很难扩展,使得代码难以阅读(代码可读性)。更重要的是,Java中的Maps往往会消耗大量的内存。用更多的Maps来填充一个Maps只会加剧内存消耗问题。所以我们在使用它的时候要小心,它将被用在真正需要它的特殊场景中。

3.使用嵌套哈希图

要创建一个嵌套地图,我们首先要创建一个普通的HashMap,只是这个地图的值将是另一个HashMap

3.1.使用Map.put()创建嵌套地图

我们可以使用Map 接口put() 方法在外层和内层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.使用创建嵌套地图

我们可以使用流api来创建嵌套地图,使用Collectors.toMap() 方法。在下面的例子中,我们正在创建一个'*Student'*类,其中有'studentId'和其他字段。

class Student
{
    private Integer studentId;
    private String studentName;
    private String course;

    // Getters & Setters
}

我们有一个学生对象的列表,从这个列表中,我们正在创建一个嵌套地图,其键为 'studentId',值为另一个地图,键为 studentName ,值为 course

// Creating Nested Map
List<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 Alex

employeeMap.get("Alex").put("Hideout", "UAE");

3.4.从嵌套地图中删除元素

要从嵌套的HashMap中移除元素,调用remove() ,与前面的例子类似。

Map<String, Map<String, String>> employeeMap = new HashMap<>();

//Hideout has been exposed so removing it

employeeMap.get("Alex").remove("Hideout");

3.5.迭代嵌套哈希图

我们可以对嵌套图进行迭代,就像我们对普通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 InnerMap
  for (Map.Entry<String, String> addressSet : addMap.entrySet()) {
    System.out.println(addressSet.getKey() + " :: " + addressSet.getValue());
  }
}

4.总结

我们已经学习了嵌套 以及如何创建它们并对元素进行添加、删除和迭代。我们还看到了我们可以在哪里使用嵌套图。