2017-03-08 58 views
1

我想创建一个Java列表的列表,这是我正在使用的代码。创建列表清单

public ArrayList<ArrayList<Object>> getRows(){ 
    ArrayList<ArrayList<Object>> listOfRows = new ArrayList<ArrayList<Object>>(); 
    ArrayList<Object> temporalRow = new ArrayList<Object>(); 
    IntNode rowSentinel = newTable.sentinel; 
    for (int y = 0; y < this.numberOfRows; y++) { 
     for (int x = 0; x < this.numberOfColumns; x++) { 
      rowSentinel =rowSentinel.next; 
      Object rowElement = rowSentinel.arrayCol.get(y); 
      temporalRow.add(rowElement); 
     } 
     rowSentinel = newTable.sentinel; 
     listOfRows.add(temporalRow); 
     System.out.print(temporalRow); 
     System.out.println(Arrays.toString(listOfRows.toArray())); 
     temporalRow.clear(); 
    } 
    return listOfRows; 
} 

然而,当我看到名单的最终名单控制台给我下面的输出:

[oddy1, minino1, libertad1][[oddy1, minino1, libertad1]] 

[oddy2, minino2, libertad2][[oddy2, minino2, libertad2], [oddy2, minino2, libertad2]] 

[oddy3, minino3, libertad3][[oddy3, minino3, libertad3], [oddy3, minino3, libertad3], [oddy3, minino3, libertad3]] 

[[], [], []] 

我也试图定义listOfRows作为ObjectsObject[]一个数组,大小数行,并通过做Object[0],Object[1]等等添加元素,但我最终得到相同的结果。

我希望得到的形式

[[oddy1, minino1, libertad1],[oddy2, minino2, libertad2],[oddy3, minino3, libertad3]] 

我真不明白我在做什么错误的代码的最终名单。任何人都可以帮助我吗?

+0

可能与以下内容重复:[http://stackoverflow.com/questions/1474954/working-with-a-list-of-lists-in-java](http://stackoverflow.com/questions/1474954/working -a-list-in-java) –

+0

尝试使用调试器,它将帮助您找出逻辑错误。 –

+0

我试图做到这一点,但我没有看到它。我认为,出于某种原因,每当我使用listOfRows上的add时,它都会添加temporalRow在程序中当前引用的所有内容。我真的不知道发生了什么事。 – user284639

回答

0

temporalRow.clear()替换为temporalRow = new ArrayList<Object>(),应该修复它。现在,您的listOfRows包含三倍对同一对象的引用,并且您以前添加的元素总是会被temporalRow.clear()删除。

0

检查出的代码下面

ArrayList<Test> temporalRow = new ArrayList<Test>(); 

    Test t = new Test(); 
    t.i = 5; 
    temporalRow.add(t); 
    System.out.println(temporalRow.get(0).i); 
    t.i = 6; 
    System.out.println(temporalRow.get(0).i); 

    class Test { 
public int i; 
} 

的上述代码的输出是5和因为temporalRow列表包含到对象t基准,并且如果该对象被修改的其他地方,变化,很明显,反映在temporalRow。你的情况是相似的。 (提示:temporalRow.clear();) 我想也许你想熟悉深拷贝vs浅拷贝的概念。