2015-09-04 22 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)); 
}