2013-08-21 64 views
0

我創建了一個HashMap十字段:key類型是Stringvalue類型爲double[]的Java的HashMap的put()的奇怪行爲

當我嘗試使用put(String id, double[] newVal)更新地圖時,不僅會更新與「id」鍵關聯的值,還會更新地圖中的所有值。

如何解決此問題?

 for (int j = 0;j<attrIndex.length;j ++){ 

     String name = train.attribute(attrIndex [j]).name(); 
     double g = eval.evaluateAttribute(attrIndex[j]); 

     double[] newVal = {0.0, 0.0}; 
     double w = 1; 
     if (g == 0.0) 
      w = 0.5; 

     newVal = table.get(name); 
     newVal[0] += g; 
     newVal[1] += w; 
     table.put(name, newVal); 

    } 
+0

我敢肯定,你是把所有鍵的相同數組的引用。好吧,這就是答案,但如果你能夠顯示你如何將元素放入Map中的代碼會更好。 –

+3

你可能總是使用相同的數組。告訴我們一些代碼 –

+2

您是否每次使用相同的密鑰? –

回答

2

我很確定真正的錯誤不在您向我們顯示的代碼中。試想一下:

double[] newVal = {0.0, 0.0}; 
    // ... 
    newVal = table.get(name); // LOOK HERE 
    newVal[0] += g; 
    newVal[1] += w; 
    table.put(name, newVal); 

乍一看,它看起來像你正在創建一個新的double[],然後更新它。但事實上,正在更新的double[]是您從哈希表中提取的那個。 (您正在初始化的double[]正在被丟棄,而您的代碼中的put操作是多餘的。)

那麼這怎麼會是一個問題?那麼,本身它不是。但它的確意味着其他的東西必須用最初的一組條目填充table。且症狀會建議該填充表的代碼看起來是這樣的:

double[] val = {0.0, 0.0}; 
    for (String name : ...) { 
     table.put(name, val); 
    } 

...這是創建所有共享相同double[]多個哈希表條目。很自然地,當你更新與一個名字相關的值時,你實際上正在更新與所有名字相關的值。


之所以JB Nizet的(現已刪除)代碼固定的問題是,它是每次更新的條目的時間更換double[]對象。

但更好的方法來解決這個問題是要改變初始化代碼如下:

for (String name : ...) { 
     double[] val = {0.0, 0.0}; 
     table.put(name, val); 
    } 

而且可以簡化您的更新代碼如下:

for (int j = 0;j<attrIndex.length;j ++){ 
    String name = train.attribute(attrIndex [j]).name(); 
    double g = eval.evaluateAttribute(attrIndex[j]); 
    double w = 1; 
    if (g == 0.0) 
     w = 0.5; 
    double[] val = table.get(name); 
    val[0] += g; 
    val[1] += w; 
} 
+0

它的工作原理,我已經明白了,謝謝你的回答。 – accand

1

您在循環的每次迭代中使用相同的數組。 變化

double[] newVal = {0.0, 0.0}; 

double[] newVal = new double[]{0.0, 0.0}; 
+1

-1:這兩個片段都做同樣的事情。 –

+0

是不是第一個只是第二個形式的簡寫? –

+0

感謝您的幫助,但正如我已經說過的,這個問題在第一次迭代期間就會出現。此外,我試着按你說的去做,而且它不工作。 – accand

1

你只創建一個單一的雙[],因此所有的鍵/值對共同的價值觀。

嘗試創建一個新的數組:

table.put(name, new double[]{newVal[0], newVal[1]); 

只是一個快速的黑客,當然也有更優雅的解決方案。