Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA,列表列表_Java_List_Arraylist - Fatal编程技术网

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时,您不会复制它,而是在第二个列表中添加对第一个列表的引用(这样您甚至不会复制它的内容)。它可以工作。谢谢现在我明白了我的想法有什么问题。如果它对你有帮助,就考虑接受答案。看见