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 DEF GHI

我的思维哪里出了问题?我应该怎么做才能得到上述结果?

4

4 回答 4

15

在 Java 中,对象总是作为引用传递。

添加singleListlistOfLists时,实际上是在添加对的引用singleList。由于您已经添加了 3 次,因此您得到了 的当前值singleList,重复了 3 次。

的“以前的值”singleList无处存储,因此A B C丢失D 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

现在,您正在打印 listOfLists,其中包含 3 次 singleList。但是 singleList 现在包含 G、H、I

要获得所需的结果,您需要使用不同的列表,一个包含 A、B、C,另一个包含 D、E、F,另一个包含 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

除了为 singleList 设置不同的变量之外,您还可以在添加到 listOfLists 时执行此操作: listOfLists.add(new ArrayList(singleList));

这将创建一个具有不同内存位置的 singlelist 副本,这与您所做的引用相同位置的内存位置不同。

于 2015-05-02T13:52:22.883 回答
0

要制作列表列表,您可以轻松地使用ArrayList<ArrayList<Integer>> listOfLists = new ArrayList<ArrayList<Integer>>;来制作整数列表列表,或者替换IntegerString您想要的任何内容。要访问项目,listOfLists.get(0).get(0)例如,使用获取listOfLists. 不确定这是否有帮助。

于 2015-09-05T13:02:08.677 回答