2012-06-14 58 views
1

如果地圖如下所示Java中,更新地圖

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); 
} 

但是定義爲

private Map<Integer, Integer> map = new HashMap<Integer, Integer>(); 

更新細密鑰的作品,我不知道,可以在同一而不必刪除該元素來完成從地圖上? (map.remove(fileHashCode);

++(map.get(fileHashCode));看起來不錯,但Java不喜歡它

+0

++(map.get(fileHashCode))並不意味着什麼.... map.get是不一樣的map.set O__O –

+0

在我的地圖,它返回一個整數,它可以是++ (ed) – JAM

+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); 
    } 
} 
+0

爲什麼'map.put(fileHashCode,++(map .get(fileHashCode)));'無效? – JAM

+0

@JAM get可以返回'null',並且你不能在方法的結果中使用'++'。 –

1

地圖的鍵和值(在這種情況下Integer)對象,所以++不起作用。不過,您可以使用put()而不必先調用remove(),結果是提供的密鑰的覆蓋值。

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); 
}