2014-10-02 67 views
2

我有2個數組列表ArrayList中無法按預期工作

ArrayList<List<Integer>> main = new ArrayList<>();  
ArrayList<Integer> sub=new ArrayList<>(); 

    sub.add(1); 
    sub.add(2); 
    main.add(sub); 
    sub.clear(); 

    sub.add(5); 
    sub.add(6); 
    sub.add(7); 
    main.add(sub); 

現在我期待主要是

what i expect main-->[[1,2],[5,6,7]] ; 
but really main-->[[567],[567]]; 

我覺得子陣列份額參考..所以我怎樣才能讓

main as [[1,2],[5,6,7] 

我無法創建sub1,sub2,...因爲實際上我在巨大的循環內部執行此操作

+1

創建一個新的'ArrayList'而不是清除一個。 – 2014-10-02 04:23:34

+0

爲什麼你要做sub.clear(); – 2014-10-02 04:23:42

+0

你可以創建'克隆'爲同樣的檢查我的答案 – Rustam 2014-10-02 04:32:52

回答

6

您要修改的列表,並添加一個更多的時間,所以這就是爲什麼[567]出現了兩次。我建議你更改代碼如下:

ArrayList<List<Integer>> main = new ArrayList<>();  
ArrayList<Integer> sub = new ArrayList<>(); 

sub.add(1); 
sub.add(2); 
main.add(sub); 

sub = new ArrayList<>(); 
sub.add(5); 
sub.add(6); 
sub.add(7); 
main.add(sub); 
2

您指的是同一個實例

sub.add(1); 
sub.add(2); 
main.add(sub); 
sub.clear(); // you are clearing same instance you added to `main` list 

您需要創建新實例

你需要

ArrayList<Integer> sub1 = new ArrayList<>(); 
sub1.add(1); 
sub1.add(2); 
main.add(sub1); 



ArrayList<Integer> sub2 = new ArrayList<>(); 
sub2.add(10); 
sub2.add(20); 
main.add(sub2); 
1

可以clone相同的對象是這樣的:

public static void main(String[] args) { 

     ArrayList<List<Integer>> main = new ArrayList<List<Integer>>();  
     ArrayList<Integer> sub=new ArrayList<Integer>(); 

      sub.add(1); 
      sub.add(2); 
      main.add(sub); 
      sub=(ArrayList<Integer>) sub.clone();// clone here 
      sub.clear(); 

      System.out.println("sub = "+sub); 
      System.out.println("main = "+main); 

      sub.add(5); 
      sub.add(6); 
      sub.add(7); 
      main.add(sub); 

      System.out.println("sub = "+sub); 
      System.out.println("main = "+main); 


    } 

輸出:

sub = [] 
main = [[1, 2]] 
sub = [5, 6, 7] 
main = [[1, 2], [5, 6, 7]] 
2

使用。新增功能添加到一個ArrayList,將相同內存地址的引用添加到ArrayList中。

因此,在您的解決方案中,ArrayList中添加了指向sub指向什麼的引用。該引用內部指向相同的位置。

現在,當您清除'sub'時,實際數據被清除,並且由於只有一個數據副本(帶有兩個引用指向它),它被清除。

現在,當您添加到sub時,它被添加到兩個引用指向的相同內存位置。因此你可以看到它的副本。

希望你明白。

1

假設你Integer的已經是一個集合,是你的‘大循環’的基礎上的:

ArrayList<List<Integer> main_list = new ArrayList<>(); 
Collection<Collection<Integer>> mySubs = xxxx; 

for (Collection<Integer> group : mySubs){ 
    List<Integer> sub = new ArrayList<>(group); 
    main_list.add(sub) 
} 

所有Collection類都有,可以採取構造等Collection

如果您沒有現有的集合,那麼您只需要使用sub.clone().clear()sub = new ArrayList<>()