我有列表和列表列表:
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("");
}
我得到的结果是:
G H I G H我 G H I
相反:
A B C. D E F. G H I
我的想法出在哪里?如何获得上述结果?
答案 0 :(得分:14)
对象始终作为Java中的引用传递。
当您将singleList
添加到listOfLists
时,您实际上是将引用添加到singleList
。由于您已经添加了3次,因此您获得了singleList
的当前值,重复了3次。
singleList
的“之前的值”无处存储,因此A B C
和D E F
会丢失。
您需要使用new ArrayList<String>(singleList)
制作列表的副本。然后,将此副本添加到listOfLists
。
答案 1 :(得分: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
答案 2 :(得分:0)
要制作列表列表,您可以轻松使用ArrayList<ArrayList<Integer>> listOfLists = new ArrayList<ArrayList<Integer>>;
制作整数列表列表,或将Integer
替换为String
或任何您想要的内容。要访问项目,请使用listOfLists.get(0).get(0)
来获取listOfLists
内第一个列表的第一项。不确定这是否有帮助。