有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JAVA,列表列表

我有一份清单和一份清单:

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 I G H I

相反:

A、B、C D E F G H I

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


共 (4) 个答案

  1. # 1 楼答案

    在添加到ListofList时,您也可以这样做,而不是为singleList使用不同的变量: 名单。添加(新ArrayList(singleList))

    与创建此列表的同一个位置的同一个副本不同,该副本指向的是另一个位置

  2. # 2 楼答案

    问题是对象引用如何工作。一步一步走

    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
    
  3. # 3 楼答案

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

  4. # 4 楼答案

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

    当您将singleList添加到listOfLists时,实际上是在向^{添加一个引用。由于已经添加了3次,所以当前值为singleList,重复了3次

    singleList“先前值”不存储在任何地方,因此A B CD E F丢失

    您需要使用new ArrayList<String>(singleList)复制您的列表。然后,将此副本添加到listOfLists