2013-08-27 54 views
1

我發現在Java中與二維的ArrayList以下行爲:二維ArrayList中不斷添加新值

ArrayList<ArrayList<Date>> parentList = new ArrayList<ArrayList<Date>>(); 
ArrayList<Date> childList = new ArrayList<Date>(); 

//Adding a date to childList 
childList.add(date1); 

//Adding a 'row' to parentList 
parentList.add(childList); 

//Adding another date to childList 
childList.add(date2); 

//Adding another row to parentList 
parentList.add(childList); 

System.out.println(parentList.get(0)); 
System.out.println(parentList.get(1)); 

//Expected output: 
// [date1] 
// [date1, date2] 

//Real output: 
// [date1, date2] 
// [date1, date2] 

如此看來到,即便在childList中已添加到parentList,新增項目到的childList也立即被添加到parentList。

我想出了這個問題,以下解決方案:

ArrayList<ArrayList<Date>> parentList = new ArrayList<ArrayList<Date>>(); 
ArrayList<Date> childList = new ArrayList<Date>(); 
ArrayList<Date> cacheList = new ArrayList<Date>(); 

//Adding a date to childList 
childList.add(date1); 

//Adding a 'row' to parentList 
parentList.add(childList); 

//Saving all current dates in cacheList 
cacheList = childList; 
childList = new ArrayList<Date>(); 

for (int i = 0; i < cacheList.size(); i++) 
{ 
    childList.add(cacheList.get(i)); 
} 

cacheList = new ArrayList<Date>(); 

//Adding another date to childList 
childList.add(date2); 

//Adding another row to parentList 
parentList.add(childList); 

System.out.println(parentList.get(0)); 
System.out.println(parentList.get(1)); 

//Expected output: 
// [date1] 
// [date1, date2] 

//Real output: 
// [date1] 
// [date1, date2] 

但我發現這個解決方案有點多餘和醜陋。

所以我想知道:這個問題有沒有更優雅的解決方案?

編輯:請注意,我需要childList累計。所以它應該包含所有元素,但是每次再添加一個元素,然後將其存儲在parentList中。

例如:

for (int i = 0; i < parentList.size(); i++) 
{ 
    System.out.println(parentList.get(i)); 
} 

應該輸出類似:

[date1] 
[date1, date2] 
[date1, date2, date3] 
[date1, date2, date3, date4] 
etc. 
+0

@RohitJain:不,因爲列表必須是累積的。所以我需要第一個元素。 –

回答

3

您兩次添加相同childList實例。所有操作都在該對象上完成。既然你添加了兩次,所有事情都會給人兩次發生的印象。要解決該問題,請添加childList的副本,如下所示:

ArrayList<ArrayList<Date>> parentList = new ArrayList<ArrayList<Date>>(); 
ArrayList<Date> childList = new ArrayList<Date>(); 

//Adding a date to childList 
childList.add(date1); 

//Adding a 'row' to parentList 
parentList.add(new ArrayList<Date>(childList)); // COPY! 

//Adding another date to childList 
childList.add(date2); 

//Adding another row to parentList 
parentList.add(new ArrayList<Date>(childList)); // COPY! 

System.out.println(parentList.get(0)); 
System.out.println(parentList.get(1)); 
+1

完美!我會在7分鐘內接受。 –