1

Java の 2 次元 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累積する必要があることに注意してください。したがって、すべての要素を含める必要がありますが、そのたびにもう 1 つ追加され、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.
4

1 に答える 1

3

childList同じインスタンスを 2 回追加しています。すべての操作はそのオブジェクトに対して行われます。2 回追加したので、すべてが 2 回起こっているような印象を受けます。これを修正するには、次のように 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));
于 2013-08-27T16:20:13.067 に答える