4

我正在对arrayLists 的arrayList 进行繁重的操作。当我试图显示父数组列表时,我有一个问题,它显示空数组列表如下

我的 arrayList 声明如下

List<List<String>> arrayList = new ArrayList<List<String>>();

这是我的孩子名单

List<String> stringLine = new ArrayList<String>();

在我的程序中,我像这样将这个 stringLine 添加到 arrayList

arrayList.add(stringLine);

到目前为止,我尝试打印父 arrayList 打印大小的 arrayList 44 内容时的输出是:[[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]

注意:在上面的输出中,44 是它拥有的 arrayList 元素的数量

当我尝试打印孩子时,它显示良好

StringLine is : [1640, 1138, 878, 1600, 1978, 280, 24, 2509, 702, 553, 2362, 2019, 1558, 2494, 823, 35, 1181, 1915, 1261, 1448, 493, 798, 1160, 651, 2249, 1639, 2428, 458, 2556, 939, 2114, 2339, 2373, 286, 2078, 844, 2673, 1486, 1657, 1531, 1043, 734, 2247, 2121, 75, 2599, 975, 29, 175, 960, 2151, 480, 868, 2627, 1941, 671, 2529, 1952, 1623, 2160, 2298]

哪里,我错了?

更新:

这是我的代码片段,我在其中将列表添加到父 arrayList

private void splitString(String temp) {
    System.out.println("In splitString method..");
    List<String> stringLine = new ArrayList<String>();
    StringTokenizer stringTokenizer = new StringTokenizer(temp, " ");
    while (stringTokenizer.hasMoreTokens()) {
        stringLine.add(stringTokenizer.nextToken());
    }
    if (stringLine.size() != 3) {
        arrayList.add(stringLine);
    }
    stringLine.clear();
}
4

4 回答 4

5

更新

发布代码后,错误很明显。正如您在此处看到的那样,List#clear将删除List. 由于您有意删除它们,因此输出为空也就不足为奇了。

删除这一行:stringLine.clear();一切都会好起来的。您正在通过List<String>引用传递arrayList.add,这意味着它仍将指向stringLine您正在清除的相同。如果你真的需要清除,你需要深度克隆。

您需要for in正确嵌套循环,一切都会正常工作:

List<List<String>> arrayList = new ArrayList<List<String>>();
List<String> stringLine = new ArrayList<String>();
stringLine.add("5");
stringLine.add("7");
arrayList.add(stringLine);
for (List<String> list : arrayList) {// each list in the arrayList
    for (String current : list) {// each element in each list
        System.out.println(current);
    }
}

或者,如果您想List一次打印整个:

for (List<String> list : arrayList) {// each list in the arrayList
    System.out.println(list); // will work as expected.
}
于 2013-05-13T15:32:34.277 回答
1

尽管人们已经回答了这个问题,但他们还没有解释为什么会发生这种情况。

Java 有对值的引用,就像 C/C++ 一样。因此,当您创建一个新的 ArrayList() 时,它会在内存中的某个位置为您创建一个新的 ArrayList。但是,如果您使用=运算符并将其分配给另一个变量,它只会指向内存中的那个位置。

ArrayList a = new ArrayList();
ArrayList b = a; //Both a and b point to the same thing here.

从现在开始,向 a 添加或删除元素与向 b 添加或删除元素相同。由于您在最后 clear() ArrayList 时在同一内存位置使用相同的 ArrayList 进行所有操作,因此所有内容都将被清除。

注意代码在做什么的一种简单方法是在向 ArrayList 的 ArrayList 中添加内容时简单地打印出来。

private void splitString(String temp) {
    System.out.println("In splitString method..");
    List stringLine = new ArrayList();
    StringTokenizer stringTokenizer = new StringTokenizer(temp, " ");
    while (stringTokenizer.hasMoreTokens()) {
        stringLine.add(stringTokenizer.nextToken());
    }
    if (stringLine.size() != 3) {
        arrayList.add(stringLine);
        System.out.println(arrayList); //DEBUG LINE HERE
    }
    stringLine.clear();
}

于 2013-05-13T15:52:39.230 回答
1

这意味着最后您要清除stringLine. 以下是测试用例

List<List<String>> arrayList = new ArrayList<List<String>>();
List<String> stringLine = new ArrayList<String>();
stringLine.add("1");
stringLine.add("2");
List<String> stringLine1 = new ArrayList<String>();
stringLine1.add("3");
stringLine1.add("4");
arrayList.add(stringLine);
arrayList.add(stringLine1);
stringLine1.clear(); // check this
stringLine.clear(); 
System.out.println(arrayList);

输出 :[[], []]

于 2013-05-13T15:39:06.167 回答
0

我假设 stringLine 是一个字符串 []。因此,您要么需要做一个数组循环(如@alex23's answer),要么像使用CollectionUtils#addAll一样:

CollectionUtils.addAll(arrayList, stringLine);
于 2013-05-13T15:34:33.873 回答