2011-11-02 58 views
2

我有一個包含10個子哈希映射的哈希映射,這些子哈希映射5個鍵映射到一個字符串數組。當我想從一個子哈希映射更新某個特定鍵的值時,所有的鍵都會被更新;不僅如此,而且所有的孩子hashmap也會得到更新。這段代碼說明了我在做什麼。嵌套哈希映射更新所有鍵的所有值,而不是我想要更改的所有值

HashMap<String, HashMap<String, String[]>> parentMap = new HashMap<String, HashMap<String, String[]>>(); 

for(String x : someArray){ // Adds 10 children hashmaps to parentMap 
    parentMap.put(x,new HashMap<String, String[]>()); 
    for(String y : someOtherArray){ // Creates 5 keys for each of the children hashmaps 
     parentMap.get(x).put(y,stringArray); 
    } 
} 

parentMap.get(someKey).put(someOtherKey,modifiedArray); // This updates the entry I want to update. 

當我與最後的指令更新,我想特別更新的關鍵,然而一切都被更新,而不是所有的按鍵爲所有的孩子都包含HashMap,而不是更新了一個我想要的。

希望它是有道理的,我不知道這是否是正確的方法,但我一直在網上尋找任何有關做類似的事情沒有任何運氣的提示。我並不擅長使用Java,如果我可以用簡單的方法實現相同的結果,那將是值得歡迎的,請注意,我不能使用List或類似的東西,因爲它使用int索引,我需要引用到我的對象使用一個字符串(就像Python上的字典)。

回答

5

這是因爲您初始化所有映射包含stringArray,即相同的陣列

這就是爲什麼改變其中之一,將改變他們所有人。

如果你想在每一個內部地圖每個鍵指向數組的不同副本,你需要做這樣的事情

... 
    parentMap.get(x).put(y, Arrays.copyOf(stringArray, stringArray.length)); 
          ^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^^^^^ 
... 

(您也可以使用例如clone或手動創建新的陣列每次你需要一個新的副本。)

+0

感謝aioobe!這解決了我的問題!我沒有想到HashMaps的行爲如此。這讓我想起C指針。 – xmc

0

@aioobe解釋了原因。

以下是解決方案。每次將其放入地圖時,都必須創建初始陣列的副本:

String[] tmpArr = new String[stringArray.length]; 
arraycopy(stringArr, 0, tmpArr, 0, stringArray.length); 
parentMap.get(x).put(y,stringArray); 
+0

感謝您的時間!在更新孩子hashmaps的值時,我使用的實現與此非常相似。 – xmc