我已經嵌套在撰寫一本書的ArrayList:在Arraylists的ArrayList中,爲什麼所有對單個元素的操作都會影響所有其他索引?
private ArrayList<ArrayList<PageContents>> book = new ArrayList<>(); //A list of lists
private ArrayList<PageContents> page = new ArrayList<>(); //A List of objects
book.add(page); //Add new(first) page in book.
PageContents pageContents = new PageContents(); //Create a new line
pagecontents.setLine("This is a line on the page"); //Edit the line
book.get(0).add(pagecontents); //Add the new (first) line to the first page of the book.
因此,在實踐中,book.get(0).get(0).getLine();
將返回的書的第一頁的第一行。
的問題
我最初以爲一切工作正常,因爲我開發的初始部分涉及得到一個單頁的權利,那麼我會擔心多頁。然後,當我將page
列表附加到book
ArrayList與book.new(page);
我發現它與page
在book.get(0)
完全一樣。 因此,book.get(0).get(0)
的值與book.get(1).get(0)
完全相同,或者book.get(0).get(20)
與book.get(1).get(20)
完全相同。
然後我想:「沒什麼大不了的,它必須複製book.get(0)
的數據,我只是在創建完成後立即清除page
陣列列表book.get(1).clear();
。」但是,這也清除了book.get(0)。然後我改變了數據book.get(1).get(9);
,並且它也將book.get(0).get(9);
更改爲相同的值。
現在我不知道發生了什麼。我認爲這可能與幾行內容有關,我將「書籍」數據與不同的類同步,可能是在複製指針,以便每個「頁面」指向相同的數據,但是在測試之後,我消除了作爲罪魁禍首。 (我剛剛刪除了這些方法)
我的ArrayLists是否在我的實現中有缺陷?
到目前爲止,ArrayList結構對我來說是完美的(直到我需要一個新的page
,就是這樣)。我只需要每個新的page
數組列表都是空白的,並將其添加到book
列表中。
任何幫助表示讚賞。多謝你們!
更完整的示例:
代碼
private ArrayList<ArrayList<PageContents>> book = new ArrayList<>(); //A list of lists
private ArrayList<PageContents> page = new ArrayList<>(); //A List of objects
book.add(page); //Add new(first) page in book.
PageContents pageContents1 = new PageContents(); //Create a new line
pagecontents1.setLine("This is Line 1 on Page 1"); //Edit the line
book.get(0).add(pagecontents1); //Add the new (first) line to the first page of the book.
System.out.println("Page1 size: " + book.get(0).size() + "pages");
System.out.println("Page1: " + book.get(0).get(0).getLine());
System.out.println("Page2 size: " + book.get(1).size() + "pages");
if(book.get(1).isEmpty()) //Should book.get(1) should be empty
{
System.out.println("Page2: EMPTY");
}
else
{
System.out.println("Page2: " + book.get(1).get(0).getLine());
}
輸出(錯誤)
Page1 size: 1
Page1: This is Line 1 on Page 1
Page2 size: 1
Page2: This is Line 1 on Page 1
輸出(它應該是什麼,如果代碼藉機如預期d)
Page1 size: 1
Page1: This is Line 1 on Page 1
Page2 size: 0
Page2: EMPTY
如果我添加這些新代碼(爲了讓第2項內容)
PageContents pageContents2 = new PageContents(); //Create a new line
pagecontents2.setLine("This is Line 1 on Page 2"); //Edit the line
book.get(0).add(pagecontents1); //Add the new (first) line to the second page of the book.
System.out.println("Page1 size: " + book.get(0).size() + "pages");
System.out.println("Page1: " + book.get(0).get(1).getLine());
System.out.println("Page2 size: " + book.get(1).size() + "pages");
System.out.println("Page2: " + book.get(1).get(1).getLine());
輸出(不正確的,這兩個頁面進行同樣的更改)
Page1 size: 2
Page1: This is Line 1 on Page 1
Page2 size: 2
Page2: This is Line 1 on Page 1
Page1 size: 2
Page1: This is Line 1 on Page 2
Page2 size: 2
Page2: This is Line 1 on Page 2
由於我添加了一個新行,兩個page
列表都有2行。每個應只有一行不同的值。
第一件事,你是等號需要在引文中:'=「pages」'應該是'+「= pages」'。或者將'='改成'+',這樣你只需要'+'頁面「' –
是的,簡單的複製/粘貼錯誤。我修好了它。意思是把一個'+'連接起來。 – LazyBear
確保在開始創建第二頁之前將'page'設置爲新的ArrayList;否則你只需將同一頁面添加到'book'兩次,並在第二次迭代中修改它。 – Gus