JAVA,列表列表
我有一份清单和一份清单:JAVA,列表列表,java,list,arraylist,Java,List,Arraylist,我有一份清单和一份清单: ArrayList<String> singleList = new ArrayList<String>(); ArrayList<ArrayList<String>> listOfLists = new ArrayList<ArrayList<String>>(); ArrayList singleList=新建ArrayList(); ArrayList ListofList=新的ArrayL
ArrayList<String> singleList = new ArrayList<String>();
ArrayList<ArrayList<String>> listOfLists = new ArrayList<ArrayList<String>>();
ArrayList singleList=新建ArrayList();
ArrayList ListofList=新的ArrayList();
我不理解这些列表的行为。我决定向您展示一个简单的示例:
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("");
}
listOfLists.clear();
singleList.clear();
单一列表。添加(“A”);
单一列表。添加(“B”);
单一列表。添加(“C”);
添加(单列表);
singleList.clear();
单一列表。添加(“D”);
单一列表。添加(“E”);
单一列表。添加(“F”);
添加(单列表);
singleList.clear();
单一列表。添加(“G”);
单一列表。添加(“H”);
单一列表。添加(“I”);
添加(单列表);
对于(int x=0;x
我得到的结果是:
G H I
G H I
G H I
相反:
A、B、C
D E F
G H I
我的思维哪里有问题?我应该怎么做才能得到上述结果?在Java中,对象总是作为引用传递的
当您将singleList
添加到listOfLists
时,您实际上是在向singleList
添加一个引用。由于已经添加了3次,因此得到了当前值singleList
,重复了3次
singleList
的“先前值”不存储在任何地方,因此abc
和def
丢失
您需要使用
新建ArrayList(singleList)
复制列表。然后,将此副本添加到列表中
问题在于对象引用如何工作。一步一步走
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
现在,您正在打印ListofList,其中包含3倍的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
在添加到ListofList时,您也可以这样做,而不是为singleList使用不同的变量: 添加(新的ArrayList(singleList))
这将创建一个singlelist副本,该副本具有不同的内存位置,而不是引用相同位置的副本。要创建列表列表,可以轻松使用
ArrayList ListofList=new ArrayList
创建整数列表,或将整数
替换为字符串
或任何您想要的内容。要访问项目,请使用listOfLists.get(0).get(0)
例如,获取listOfLists
中第一个列表的第一项。不确定这是否有帮助。因为当您将singleList添加到ListofList时,您不会复制它,而是在第二个列表中添加对第一个列表的引用(这样您甚至不会复制它的内容)。它可以工作。谢谢现在我明白了我的想法有什么问题。如果它对你有帮助,就考虑接受答案。看见