作者:桑倪娜 | 来源:互联网 | 2022-11-24 08:25
插入哈希映射时,是否总是要检查是否存在与要插入的密钥对应的空值?
例如,如果我想跟踪字符出现在单词中的次数,使用hashmap,我是否总是这样做:
if(hashMap.containsKey(ch)){
hashMap.replace(ch, 1+hashMap.get(ch));
}
else{
hashMap.put(ch, 1);
}
或者有一个功能可以为我处理这个?
1> Ousmane D...:
使用merge
.
hashMap.merge(ch, 1, (left, right) -> left + right);
或使用方法参考:
hashMap.merge(ch, 1, Math::addExact);
如果指定的键(ch
在这种情况下)尚未与值关联或与null关联,则将其与给定的非空值(1
在本例中)相关联.
如果指定的键与非空值相关联,则它将相关值替换为给定重映射函数的结果(left, right) -> left + right
.
2> ernest_k..:
你不必.Map
有一个merge
方法,您可以使用它来更新值:
hashMap.merge(ch, 1, (oldVal, newVal) -> oldVal + newVal);
那是做什么的:
如果hashMap
还没有ch
密钥,则添加一个新条目ch
作为键和1
值
如果hashMap
已经有一个带有ch
键的条目,则调用最后一个函数来计算更新值.在这种情况下,(oldVal, newVal) -> oldVal + newVal
只需将旧值添加到新值即可.
正如Andy的评论所指出的,你也可以使用Map.compute
:
int newValue = hashMap.compute(ch,
(key, existingVal) -> (existingVal == null) ? 1 : existingVal + 1);
你也可以使用`compute`(我认为合并是使用它实现的).