代码之家  ›  专栏  ›  技术社区  ›  Al Grant

containsKey检查嵌套的LinkedHashMap

  •  0
  • Al Grant  · 技术社区  · 5 年前

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

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

    我在一个java对象列表上循环,这些对象有一个属性date和许多重复的日期,以及一个字符串属性stringAttr,该属性是enum到“红色”、“绿色”、“蓝色”。我在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的方式有什么问题?

    0 回复  |  直到 5 年前
        1
  •  2
  •   vsfDawg    5 年前

    在所有情况下,都将替换与外部键关联的内部映射。这就消除了之前添加的所有映射。当发现现有映射时,应该更新它们,如果缺少映射,则应该添加它们。

    以下是我认为你试图做的事情的天真版本。

    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);