Java 为什么ArrayList.clear()/ArrayList.removeAll()正在清除我声明的两个列表?
我必须返回ArrayList的ArrayList,因为它是预定义的。 我尝试了n行pascal三角形的代码:Java 为什么ArrayList.clear()/ArrayList.removeAll()正在清除我声明的两个列表?,java,arraylist,Java,Arraylist,我必须返回ArrayList的ArrayList,因为它是预定义的。 我尝试了n行pascal三角形的代码: 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<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][11][12 1][13 1]
我想知道为什么我在以下位置放置clear函数时没有获得所需的输出:
第1位输出:[1 3 3 1][1 3 3 1][1 3 3 1][1 3 3 1]仅放在最后一行
位置2:[]无输出
removeAll的情况也是如此。它是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;
不确定你是否理解这个问题 由于数组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>();
您只有一个ArrayList,并且有多个对它的引用。一个参考是b。其余的在a内。请参见: