给定带有 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() 方法
LeetCode 981. 基于时间的键值存储 / 274. H 指数 / 275. H 指数 II