2013-07-26 97 views
0

下面的代碼的輸出是[[3],[3],[3],[3]]。
在我看來,它應該是[[0],[1],[2],[3]] 集合似乎保留其大小,但不是通過循環它的元素。添加到一組包含循環的集合

Set<Set<String>> mySetOfSets = new HashSet<Set<String>>(); 
mySetOfSets.clear();    

Set<String> numbers = new HashSet<String>(); 

for(int i=0; i<4 ; i++) 
{ 
    numbers.clear(); 
    String iAsString = String.valueOf(i); 
    numbers.add(iAsString); 
     mySetOfSets.add(numbers);      
} 
    System.out.println(mySetOfSets); 
+1

第二個在同一天:) http://stackoverflow.com/q/17871203/335858 – dasblinkenlight

回答

5

的問題是,您要添加的Set<Set<String>> mySetOfSets相同Set<String> numbers變量。您必須在每次循環迭代中創建Set<String> numbers的新實例。

for(int i=0; i<4 ; i++) { 
    Set<String> numbers = new HashSet<String>(); 
    //rest of your code... 
} 

在你的代碼應用建議修復之前,你這樣做:

  1. 擁有單一Set<String> numbers
  2. 清除項目。
  3. 將一個新項目添加到numbers
  4. numbers加入Set<Set<String>> mySetOfSets
  5. 再回到點2

通過應用代碼中所提出的修復,現在你這樣做:

  1. 創建的Set<String> numbers一個新的實例,這將是從以前的不同Set<String>實例。
  2. 清除它的物品(注意,這應該被刪除,因爲是新的Set<String>,因此無需清除它)。
  3. 將一個新項目添加到numbers
  4. numbers加入Set<Set<String>> mySetOfSets
  5. 再回到點1
+0

太棒了!你能解釋爲什麼解決這個問題嗎?我想我不明白什麼時候應該在循環內部或外部定義變量。 – user2623054

+0

@ user2623054答案已更新。讓我知道你是否需要更好的解釋這個問題。 –

+0

我瞭解正在發生的事情的不同之處;但我不明白爲什麼這個細微的變化會影響最終結果(即mySetofSets的內容)。爲什麼新實例更好? – user2623054

相關問題