2014-09-27 53 views
1

我有一個toCopyHashMap它的形式爲HashMap<String, Set<Integer>>toCopy的密鑰是由兩個數字組成的字符串,如「01」或「10」。關於Java HashMap:當密鑰是一組時<Integer>

當我想以一個值添加到條目「01」,我做了

toCopy.get("01").add(1); 

在這種情況下,由於某種原因,這兩個「01」和「10」項值進行了更新。有人可以幫我弄清楚爲什麼會發生這種情況?

我也試着這樣做:

Set<Integer> a = toCopy.get("01") 
a.add(1) 
toCopy.put("01",a) 

但結果是一樣的。

我試着用調試器來找出發生了什麼事情,但似乎HashMap中剛剛更新在同一時間兩個條目..

編輯:這裏是我的代碼

Map<String,Set<Integer>> toCopy = new HashMap<>(); 
    // initialize toCopy map 
    for(int d1 = 0; d1<dataCenters;d1++){ 
     for(int d2 = 0; d2<dataCenters;d2++){ 
      if(d1!=d2){ 
       Set<Integer> value = new HashSet<>(); 

       String key1 = Integer.toString(d1).concat(Integer.toString(d2)); 
       String key2 = Integer.toString(d2).concat(Integer.toString(d1)); 


       toCopy.put(key1,value); 
       toCopy.put(key2,value); 
      } 
     } 
    } 
    System.out.println(toCopy); 

    for(int i = 0; i < dataCenters; i++){ 
     for(int j = 1; j < dataCenters-1; j++){ 
      // data from two centers 
      Set<Integer> d1Data = data.get(i); 
      Set<Integer> d2Data = data.get(j); 
      // d1 => d2 
      // loop over data in d1, find those needed to be transferred 
      for(Integer d1: d1Data) { 
       String d1Tod2 = Integer.toString(i).concat(Integer.toString(j)); 
       if(!d2Data.contains(d1)){ 

        toCopy.get("01").add(d1); 
       } 
      } 
+0

請提供全面,工作例子演示了這種行爲。 – 2014-09-27 05:44:37

回答

6

你是把相同的值設置爲兩個不同的鍵:

 Set<Integer> value = new HashSet<>(); 

     String key1 = Integer.toString(d1).concat(Integer.toString(d2)); 
     String key2 = Integer.toString(d2).concat(Integer.toString(d1)); 


     toCopy.put(key1,value); 
     toCopy.put(key2,value); 

這就是爲什麼改變其中之一改變兩個。

您需要創建一組不同的每個鍵:

 Set<Integer> value1 = new HashSet<>(); 
     String key1 = Integer.toString(d1).concat(Integer.toString(d2)); 
     toCopy.put(key1,value1); 
     Set<Integer> value2 = new HashSet<>(); 
     String key2 = Integer.toString(d2).concat(Integer.toString(d1)); 
     toCopy.put(key2,value2); 
+0

非常感謝!沒有抓住那個! – user3266840 2014-09-27 05:52:19