2015-09-04 58 views
1
ArrayList<ArrayList<Integer>> result = new ArrayList<>(); 
    ArrayList<Integer> temp = new ArrayList<>(); 
    temp.add(1); 
    temp.add(2); 
    result.add(temp); 
    temp.remove(temp.size() - 1); 
    temp.add(1, 3); 
    result.add(new ArrayList<>(temp)); 

結果是[[1,3],[1,3]],但我認爲它應該是[[1,2],[1,3]],爲什麼?關於結果的java ArrayList

回答

5

跟隨評論

temp.add(1); /aaded 1 
temp.add(2);/added 2 
result.add(temp); 
temp.remove(temp.size() - 1); // removed index 1 that i.e removed 2 
temp.add(1, 3); // added 3 at the index 1 again. now it is 1,3 
result.add(new ArrayList<>(temp)); // And you are added a new array list again with temp 

如果我理解正確的話,你在

temp.add(1, 3); 

誤解的邏輯這意味着你說的是指數1在列表temp增加值3

2

輸出不言自明。

誤解

1)temp.remove(temp.size() - 1);

這從temp list刪除最後一個元素,並且自temp list被稱爲內部result所以得到引用那裏。

2.)temp.add(1, 3);

它將在temp list索引1在添加值3。

public static void main(String[] args) { 
     ArrayList<ArrayList<Integer>> result = new ArrayList<>(); 

     ArrayList<Integer> temp = new ArrayList<>(); 
     temp.add(1); 
     temp.add(2); 
     System.out.println("Temp is : " + temp); 

     result.add(temp); 
     System.out.println("Result is : " + result); 

     temp.remove(temp.size() - 1); 
     System.out.println("Temp is : " + result); 
     System.out.println("Result is : " + result); 

     temp.add(1, 3); 
     System.out.println("Temp is : " + temp); 

     result.add(new ArrayList<>(temp)); 
     System.out.println("Result is : " + result); 
    } 

輸出

Temp is : [1, 2] 
Result is : [[1, 2]] 
Temp is : [[1]] 
Result is : [[1]] 
Temp is : [1, 3] 
Result is : [[1, 3], [1, 3]] 
0

如果更新temp直接那麼所有指向該list也被更新(在你的情況result列表第一個指數)的引用,這就是爲什麼你得到[[1, 3], [1, 3]]輸出。

您可以使用下面的代碼。

ArrayList<ArrayList<Integer>> result = new ArrayList<>(); 
ArrayList<Integer> temp = new ArrayList<>(); 
temp.add(1); //added 1 
temp.add(2); // added 2 
result.add(temp); 

// creating new object and populating it with the values of temp. 
ArrayList<Integer> temp1 = new ArrayList<>(temp); 

// or you can reinitialize temp with its previous values and then use it as you have done in your code. 
// temp = new ArrayList<>(temp); 

temp1.remove(temp1.size() - 1); 
temp1.add(1, 3); 
result.add(temp1); 

System.out.println(result); 

輸出:

[[1, 2], [1, 3]] 
0

的問題是,你不要溫度的值複製到結果,但你只是給予臨時的參考。

通過更改引用可以更改結果。

爲了解決這個問題,試試這個:

public void test1() { 
    ArrayList<ArrayList<Integer>> result = new ArrayList<>(); 
    ArrayList<Integer> temp = new ArrayList<>(); 
    ArrayList<Integer> temp2 = new ArrayList<>(); 
    temp.add(1); 
    temp.add(2); 
    result.add(new ArrayList<>(temp)); 
    temp.remove(temp.size() - 1); 
    temp.add(1, 3); 
    result.add(new ArrayList<>(temp)); 
}