1

如果地图被定义为

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 不喜欢它

4

3 回答 3

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);
}
于 2012-06-14T17:13:06.727 回答
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);
    }
}
于 2012-06-14T17:04:53.330 回答
1

映射的键和值是对象(Integer在这种情况下),因此 ++ 不起作用。但是,您可以put()在不先调用remove()的情况下使用,结果是所提供键的覆盖值。

于 2012-06-14T17:07:02.403 回答