如果map定义为
private Map<Integer, Integer> map = new HashMap<Integer, Integer>();
更新密钥可以正常工作,如下所示
public void increaseCountInFile(Integer hashCode) {
if (mapContains(hashCode)) {
increaseCount(hashCode);
} else {
map.put(hashCode, 1);
}
}
private void increaseCount(Integer fileHashCode) {
Integer key = map.get(fileHashCode);
map.remove(fileHashCode);
map.put(fileHashCode, ++key);
}
private boolean mapContains(Integer fileHashCode) {
return map.containsKey(fileHashCode);
}
但是,我想知道,可以在不必从地图中删除元素的情况下完成同样的操作吗? (map.remove(fileHashCode);
)
++(map.get(fileHashCode));
看起来不错,但Java不喜欢它
答案 0 :(得分:3)
您不需要
map.remove(fileHashCode);
put()
会自动覆盖该条目。您可以像这样缩短increaseCount()
方法:
private void increaseCount(Integer fileHashCode) {
map.put(fileHashCode, map.get(fileHashCode)+1);
}
老实说,我认为你在代码中添加了太多的抽象。除非你有一个很好的理由,否则它应该只是一种方法:
public void increaseCountInFile(Integer hashCode) {
if(map.containsKey(hashCode)) {
map.put(hashCode, map.get(hashCode)+1);
} else {
map.put(hashCode, 1);
}
}
答案 1 :(得分:3)
@ tskuzzy的回答稍微高效一点。这只执行一次查找。
public void increaseCountInFile(Integer hashCode) {
Integer prev = map.get(hashCode);
if (prev == null) prev = 0;
map.put(hashCode, prev + 1);
}
如果使用TIntIntHashMap,则可以避免使用对象或检查以前的值。
public void increaseCountInFile(int hashCode) {
map.adjustValue(hashCode, 1, 1);
}
答案 2 :(得分:1)
地图的键和值是对象(在这种情况下为Integer
),因此++不起作用。但是,您可以先使用put()
而不先调用remove()
结果是提供的密钥的覆盖值。