【问题标题】:Update a hashmap value, given a key with getOrDefault给定带有 getOrDefault 的键,更新 hashmap 值
【发布时间】:2018-10-15 17:02:58
【问题描述】:

我有一个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

我错过了什么?

【问题讨论】:

    标签: java-8 hashmap


    【解决方案1】:

    Java 8 将merge 方法引入Map 接口就是针对此类问题:

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

    意思是“把 1000 给这个键,但是如果这个键已经有一个值,就给它加 1000”。

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

    【讨论】:

      【解决方案2】:

      你可以这样做:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        • 2016-04-21
        相关资源
        最近更新 更多