Java,更新地图

时间:2012-06-14 17:03:34

标签: java map

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

3 个答案:

答案 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()结果是提供的密钥的覆盖值。