首页 > 解决方案 > containsKey 检查嵌套的 LinkedHashMap

问题描述

我有一个嵌套的 HashMap(2 级)。顶层是日期,第二层可以包含三个枚举字符串之一和一个整数:

HashMap<LocalDate, HashMap<String, Integer>> hashMap = new  HashMap<>();

我正在遍历一个 java 对象列表,这些对象的属性日期重复了许多日期,字符串属性 stringAttr 是“红色”、“绿色”、“蓝色”的枚举。我正在向 HashMap 添加:

if (hashMap.containsKey((a.startDate.toLocalDate()))) { // does date exist?
    if (hashMap.get(a.startDate.toLocalDate()).containsKey(a.getStringAttr())) { // does String also exist?
        previousValue = hashMap.get(a.startDate.toLocalDate()).get(a.getStringAttr()); //if date and String exist - set previousValue
     } else {
           previousValue = 0; // String does not exist
     }
  } else {
        previousValue = 0; // Date does not exist
}

hashMap.put(a.startDate.toLocalDate(), new HashMap(){{put(a.getStringAttr(), previousValue + 1);}});

这正确地产生了一个唯一日期列表,但内部 HashMap 只列出一个字符串。

我试图将键/值对放入内部 HashMap 的方式有什么问题?

标签: java

解决方案


在所有情况下,您都在替换与外部键关联的内部 Map。这消除了所有先前添加的映射。您应该在找到现有映射时更新它们,并在它们丢失时添加映射。

这是我认为您正在尝试做的事情的幼稚版本。

LocalDate date = a.startDate.toLocalDate();
String attr = a.getStringAttr();
// If the date is not a key, add it mapping to an empty Map
if (! hashMap.containsKey(date) {
  hashMap.put(date, new HashMap<String,Intger>());
}
// If the attr is not an inner key, add it mapping to 0
if (! hashMap.get(date).containsKey(attr)) {
  hashMap.get(date).put(attr, 0);
}
// increment
int previous = hashMap.get(date).get(attr);
hashMap.get(date).put(attr, previous + 1);

推荐阅读