2010-11-11 71 views
2

假設我有一個包含字符串「A」,「B」,「C」,「D」,「E」的字符串ArrayList,名爲list1。然後我有另一個類型爲storageUnit的ArrayList,它是我寫的一個類,名爲list2。請參閱下面的代碼爲更好的解釋:Java ArrayList幫助

ArrayList<String> list1 = new ArrayList<String>(); 
ArrayList<storageUnit> list2 = new ArrayList<storageUnit>(); 

storageUnit newUnit = new storageUnit(); 
for (int i = 0; i < list1.size(); i++) { 
    newUnit.category = list1.get(i); 
    list2.add(newUnit);  
} 

static class storageUnit { 
    String category; 
    Hashtable<String, Integer> wordTable = new Hashtable<String, Integer>(); 
}; 

現在,如果我嘗試打印列表2所有storageUnits的所有類別,我得到[E,E,E,E,E]而不是[A,B ,C,D,E]。任何人都可以解釋爲什麼會發生?

回答

6

變化

storageUnit newUnit = new storageUnit(); 
for (int i = 0; i < list1.size(); i++) { 
    newUnit.category = list1.get(i); 
    list2.add(newUnit);  
} 

for (int i = 0; i < list1.size(); i++) { 
    storageUnit newUnit = new storageUnit(); 
    newUnit.category = list1.get(i); 
    list2.add(newUnit);  
} 

你的代碼所做的是建立一個單一的對象(newUnit),並補充說,到列表中多次。每次您都會覆蓋它的類別,因此當您打印列表時,您會多次獲得相同的值。

相反,您需要每次創建一個新的newUnit對象。

+0

是的,這是有道理的。謝謝! – TookTheRook 2010-11-11 20:49:18

2

當您將新單元添加到list2時,您將添加5次相同的storageUnit實例。這意味着如果你改變一個,你會改變其餘的。您需要在每次添加到list2時申報新的存儲單元。

ArrayList<String> list1 = new ArrayList<String>(); 
ArrayList<storageUnit> list2 = new ArrayList<storageUnit>(); 


for (int i = 0; i < list1.size(); i++) { 
    storageUnit newUnit = new storageUnit();  
    newUnit.category = list1.get(i); 
    list2.add(newUnit);  
} 

static class storageUnit { 
    String category; 
    Hashtable<String, Integer> wordTable = new Hashtable<String, Integer>(); 
}; 
+0

有道理。謝謝! – TookTheRook 2010-11-11 20:49:56

1

我覺得應該是list1.get(i),你也應該循環

1

1)用大寫字母開頭的類名稱中創建新的單位。應該是StorageUnit而不是storageUnit。

2)你讓你的newUnit在循環之外。然後將相同的單位添加到列表中5次。相反,嘗試:

for (int i = 0; i < list1.size(); i++) { 
    storageUnit newUnit = new storageUnit(); 
    newUnit.category = list1.get(0); 
    list2.add(newUnit);  
} 
1
ArrayList<String> list1 = new ArrayList<String>(); 
ArrayList<storageUnit> list2 = new ArrayList<storageUnit>(); 


for (int i = 0; i < list1.size(); i++) { 
    storageUnit newUnit = new storageUnit(); 
    newUnit.category = list1.get(i); 
    list2.add(newUnit);  
} 

static class storageUnit { 
    String category; 
    Hashtable<String, Integer> wordTable = new Hashtable<String, Integer>(); 
}; 

夫婦的事情。您在循環的每次迭代中獲取list1 ArrayList的第一個元素。另外,你在循環之外創建的newUnit對象有參考問題。您創建了一次並將其插入ArrayList中多次。 ArrayList指向一個對象多次。循環的最後一次迭代將單位設置爲具有'E'值,因此ArrayList(list2)中的所有條目都指向具有值「E」的相同單位。

0

試試這個..

在for循環迭代,同一對象(newUnit.category)被初始化爲類別中獲得的價值。所以每次迭代都會覆蓋類別值。 incase of use under the following coding ..

storageUnit newUnit = new storageUnit();

for (int i = 0; i < list1.size(); i++) { 
    newUnit.category = list1.get(i); 
    list2.add(newUnit);  
} 

storageUnit newUnit =新storageUnit();與for循環 ,以便它可以爲每個迭代創建新的對象,並且值不會被覆蓋。

for (int i = 0; i < list1.size(); i++) { 
     storageUnit newUnit = new storageUnit(); 
     newUnit.category = list1.get(i); 
     list2.add(newUnit);  
    } 

希望幫助ü..