3

リストとリストのリストがあります:

ArrayList<String> singleList = new ArrayList<String>();
ArrayList<ArrayList<String>> listOfLists = new ArrayList<ArrayList<String>>();

これらのリストの動作がわかりません。簡単な例を示すことにしました。

listOfLists.clear();

singleList.clear();
singleList.add("A");
singleList.add("B");
singleList.add("C");
listOfLists.add(singleList);

singleList.clear();
singleList.add("D");
singleList.add("E");
singleList.add("F");
listOfLists.add(singleList);

singleList.clear();
singleList.add("G");
singleList.add("H");
singleList.add("I");
listOfLists.add(singleList);

for(int x = 0; x < listOfLists.size(); x++)
{
    for(int z = 0; z < singleList.size(); z++)
        {
        System.out.print(listOfLists.get(x).get(z));
        System.out.print(" ");
    }
    System.out.println("");
}

そして、私が得た結果は次のとおりです。

ギギギ

その代わり:

ABC デフ GHI

私の考えのどこに問題がありますか?上記の結果を得るにはどうすればよいですか?

4

4 に答える 4

15

Java では、オブジェクトは常に参照として渡されます。

に追加singleListするとlistOfLists、実際には への参照が追加されsingleListます。を 3 回追加したので、現在の値 が得られ、singleList3 回繰り返されます。

「以前の値」singleListどこにも保存されないためA B CD E F失われます。

を使用して、リストのコピーを作成する必要がありますnew ArrayList<String>(singleList)。次に、このコピーを に追加しますlistOfLists

于 2013-10-26T10:56:28.127 に答える
4

問題は、オブジェクト参照がどのように機能するかです。一歩一歩進む

singleList.clear();
singleList.add("A");
singleList.add("B");
singleList.add("C");
listOfLists.add(singleList);

//singleList -> A, B, C 
//listOfLists -> singleList

singleList.clear();
singleList.add("D");
singleList.add("E");
singleList.add("F");
listOfLists.add(singleList);

//singleList -> D, E, F
//listOfLists -> singleList, singleList

singleList.clear();
singleList.add("G");
singleList.add("H");
singleList.add("I");
listOfLists.add(singleList);

//singleList -> G, H, I
//listOfLists -> singleList, singleList, singleList

ここで、singleList を 3 回含む listOfLists を出力しています。しかし、singleList には G、H、I が含まれるようになりました

目的の結果を得るには、異なるリストを使用する必要があります。1 つは A、B、C で、もう 1 つは D、E、F で、もう 1 つは G、H、I です。

singleList1 -> A, B, C
singleList2 -> D, E, F
singleList3 -> F, G, H
listOfLists -> singleList1, singleList2, singleList3
于 2013-10-26T10:57:01.340 に答える
0

listOfLists に追加するときに、singleList に異なる変数を使用する代わりに、これを行うこともできます。

これにより、同じ場所を参照したものとは異なり、異なるメモリ場所を持つ singlelist のコピーが作成されます。

于 2015-05-02T13:52:22.883 に答える