2017-03-08 93 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淺拷貝的概念。