为什么ArrayList.clear()/ ArrayList.removeAll()清除我声明的两个列表?

时间:2019-03-14 18:57:21

标签: java arraylist

我必须返回ArrayList中的ArrayList<Integer>,因为它是预定义的。
我正在尝试此代码(对于n行的帕斯卡三角形):

ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> b = new ArrayList<Integer>();
for(int i=1;i<=n;i++){
    int c=1;
    //ArrayList<Integer> b = new ArrayList<Integer>(); I declared
    //the arraylist here to solve the problem
    // Place 1: b.clear()
    for(int j=1;j<=i;j++){
        b.add(c);
        c=(c*(i-j))/j;
    }
    a.add(b);
    // Place 2: b.clear();
}
return a;

预期输出: n=4[1 ] [1 1 ] [1 2 1 ] [1 3 3 1 ]
我想知道为什么在以下位置放置了清晰的函数时却没有得到想要的输出:
放置1个输出:[1 3 3 1 ] [1 3 3 1 ] [1 3 3 1 ] [1 3 3 1 ](仅最后一行)
地方2:[ ] [ ] [ ] [ ](无输出)
removeAll()也是如此。

2 个答案:

答案 0 :(得分:1)

即使您已清除,它也与ArrayList相同。因此,修改一个副本也会同时修改所有其他副本。您实际上应该在创建ArrayList的新实例,而不是清除它。修改后的代码如下:

ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> b;
for (int i = 1; i <= n; i++) {
    int c = 1;
    // ArrayList<Integer> b = new ArrayList<Integer>(); I declared
    // the arraylist here to solve the problem
    b = new ArrayList<Integer>(); // NEW INSTANCE INSTEAD OF CLEARING IT
    for (int j = 1; j <= i; j++) {
        b.add(c);
        c = (c * (i - j)) / j;
    }
    a.add(b);
}
return a;

答案 1 :(得分:1)

不确定您是否理解问题 由于数组b在for循环外部声明,因此在外部循环上进行每次迭代之后,将使用同一对象并继续使用旧值。

要获得期望的输出,请在外循环中创建新的b对象

代替

ArrayList<Integer> b = new ArrayList<Integer>();
for(int i=1;i<=n;i++){

尝试

ArrayList<Integer> b = null;
for(int i=1;i<=n;i++){
b = new ArrayList<Integer>();