代码之家  ›  专栏  ›  技术社区  ›  yaylitzis

给定一个带有getOrDefault的键,更新hashmap值

  •  4
  • yaylitzis  · 技术社区  · 6 年前

    我有一个 HashMap :

    HashMap<string, Integer> hmap = new HashMap<>();
    

    我想增加HashMap的值。为了避免 nullPointer Exception 如果钥匙不存在,我会检查它!假设数据是:

    //201803271 - 1000
    //201803271 - 1000
    //201803272 - 1000
    
    //inside a loop i read the data...
      if (hmap.get("201803271") != null) {
          hmap.put("201803271", hmap.get("201803271") + 1000);
      }else{
          hmap.put("201803271", 1000);
      }
    //end of loop
    

    我得到的结果是:

    201803271 - 2000
    201803272 - 1000
    

    但是,我读到了这个问题 How to update a value, given a key in a java hashmap? 还有一个使用Java 8方法的解决方案 getOrDefault .我试过了

    hmap.put("201803271", count.getOrDefault("201803271", 1000) + 1000)
    

    然而,使用此解决方案,我得到了错误的结果。。。

    201803271 - 3000
    201803272 - 2000
    

    我错过了什么?

    2 回复  |  直到 6 年前
        1
  •  5
  •   Andrew    6 年前

    引入Java 8 merge 方法到 Map 仅针对此类问题的接口:

    hmap.merge("201803271", 1000, Integer::sum);
    

    这意味着“为该键输入1000,但如果该键已经有值,则向其添加1000”。

    您的解决方案不起作用的原因是您在默认情况下获得了1000,然后向其中添加了1000。要正确执行此操作,请使用 getOrDefault ,您希望在中用0替换1000 getOrDefault hmap.put("201803271", count.getOrDefault("201803271", 0) + 1000))

        2
  •  3
  •   Oleg Cherednik    6 年前

    您可以这样做:

    map.put(key, map.getOrDefault(key, 0) + inc);
    

    map.compute(key, (k, v) -> v == null ? inc : v + inc);