我一直致力于一个更大的项目,遇到了一个我在这里以更简单的方式复制的问题。我要做的是将一个Integers的ArrayList添加到另一个ArrayList中。问题是我添加到较大的ArrayList中的每个ArrayList都会更新,就好像它们都是一样的。
public class RecursionTest {
static ArrayList<Integer> test = new ArrayList<Integer>();
static ArrayList<ArrayList<Integer>> test1 = new ArrayList<ArrayList<Integer>>();
public static void testRecurse(int n) {
test.add(n);
if (n % 2 == 0) {
test1.add(test);
}
if (n == 0) {
for (ArrayList<Integer> a : test1) {
for (Integer i : a) {
System.out.print(i + " ");
}
System.out.println();
}
return;
}
testRecurse(n - 1);
}
public static void main(String[] args) {
testRecurse(10);
}
}
我得到的输出是:
10 9 8 7 6 5 4 3 2 1 0
10 9 8 7 6 5 4 3 2 1 0
10 9 8 7 6 5 4 3 2 1 0
10 9 8 7 6 5 4 3 2 1 0
10 9 8 7 6 5 4 3 2 1 0
10 9 8 7 6 5 4 3 2 1 0
应该是:
10
10 9 8
10 9 8 7 6
10 9 8 7 6 5 4
10 9 8 7 6 5 4 3 2
10 9 8 7 6 5 4 3 2 1 0
有人可以向我解释这里发生了什么吗?也许建议解决这种情况。
答案 0 :(得分:1)
您正在反复向test
添加完全相同的对象ArrayList
。这就是他们一起被修改的原因。
每次要添加时,都需要在添加之前创建new ArrayList<Integer>()
。
您可以尝试替换
test1.add(test);
带
test = new ArrayList<Integer>(test);
test1.add(test);
这会复制当前测试,然后将其添加到列表中。
这仍然意味着Integer
中包含的ArrayList
元素会出现相同的错误,因为这是一个浅层副本,但是由于你没有修改它们,所以这种情况可以。