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

Posted

技术标签:

【中文标题】给定带有 getOrDefault 的键,更新 hashmap 值【英文标题】:Update a hashmap value, given a key with getOrDefault 【发布时间】: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

我错过了什么?

【问题讨论】:

【参考方案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);

【讨论】:

以上是关于给定带有 getOrDefault 的键,更新 hashmap 值的主要内容,如果未能解决你的问题,请参考以下文章

Java HashMap getOrDefault() 方法

使用过滤器方法并从给定字典中查找值在 5 到 8 之间的键

LeetCode 981. 基于时间的键值存储 / 274. H 指数 / 275. H 指数 II

Map.getOrDefault()方法

映射 getOrDefault VS getOrUseSupplier

由于 `HashMap.getOrDefault()` 函数中的接收器类型不匹配,以下候选均不适用