2017-05-24 50 views
-1

對不起,我的英文不是我的母語。爲什麼實例的ArrayList上的動作.remove()也適用於其他實例

總結: 我創建一個包含Box列表的Pile。 每個Box都包含一個String列表。

我想要做的事: 從第一個Box的String列表中刪除一個特定的String。

會發生什麼: 的特定字符串從第一盒也從所有其他箱中刪除。

類樁:

public class Pile { 

public ArrayList<Box> listBox; 

public Pile(ArrayList<Box> listToAdd) { 
    listBox = listToAdd; 
} 

public void showPile() { 
    for (Box b : listBox) { 
     System.out.println(b); 
    } 
} 
} 

類箱:

public class Box { 

public String name; 
public ArrayList<String> list; 

public Box(String nameToAdd, ArrayList<String> listToAdd) { 
    name = nameToAdd; 
    list = listToAdd; 
} 

public String toString() { 
    return this.name + " : " + this.list; 
} 
} 

主營:

public class Main { 

    public static void main(String[] args) { 

     ArrayList<String> list = new ArrayList<String>(); 
     list.add("AA"); 
     list.add("BB"); 
     list.add("CC"); 
     list.add("DD"); 
     list.add("EE"); 

     Box box1 = new Box("box1", list); 
     Box box2 = new Box("box2", list); 
     Box box3 = new Box("box3", list); 

     ArrayList<Box> listBox = new ArrayList<Box>(); 

     listBox.add(box1); 
     listBox.add(box2); 
     listBox.add(box3); 

     Pile pile = new Pile(listBox); 

     System.out.println("BEFORE"); 
     pile.showPile(); 

     pile.listBox.get(0).list.remove("CC"); 

     System.out.println("AFTER"); 
     pile.showPile(); 
    } 
} 

其中給出的結果:

BEFORE 
box1 : [AA, BB, CC, DD, EE] 
box2 : [AA, BB, CC, DD, EE] 
box3 : [AA, BB, CC, DD, EE] 
AFTER 
box1 : [AA, BB, DD, EE] 
box2 : [AA, BB, DD, EE] 
box3 : [AA, BB, DD, EE] 

所以"CC"不從box1列表中刪除只,這也從box2box3列表中刪除。

你知道我在做什麼錯嗎?

謝謝你的幫助。

+1

請提供一個[mcve] - 目前它是不完整的*和*它遠非最小。 –

+0

請[編輯]你的問題,以顯示你如何創建這些星期對象,填充他們的課程,並將它們添加到日曆。 – Kenster

+0

請提供您添加和刪除課程和周的所有課程和主要方法。 –

回答

0

您的方框列表是相同的列表,因此當您從列表中刪除一個對象時,所有方框都將受到影響。

要解決此問題,只需創建爲每個箱子一個新的列表,通過改變

Box box1 = new Box("box1", list); 
Box box2 = new Box("box2", list); 
Box box3 = new Box("box3", list); 

Box box1 = new Box("box1", new ArrayList<>(list)); 
Box box2 = new Box("box2", new ArrayList<>(list)); 
Box box3 = new Box("box3", new ArrayList<>(list)); 

通過使用new ArrayList<>(list)您可以創建具有相同的元素一個完全新的列表原始列表。因此,編輯框的列表不會影響其他框,因爲它們不共享相同的列表。

+0

非常感謝您的幫助。 有一些我不明白的:對於所有的框有相同的列表,不會列出必須是一個靜態屬性? 由於每個Box都包含自己的列表,爲什麼每次創建Box的新實例時都不會創建一個新列表? –

+0

它不需要是具有相同值的靜態字段。假設你有一個類似於Object a = new Object()的代碼;對象b = a;','b'和'a'共享同一個對象,就像你的例子中'box1.list'等於'box2.list'一樣。 – Dolf

相關問題