递归中的ArrayLists的ArrayList

时间:2013-08-10 02:20:58

标签: java recursion arraylist

我一直致力于一个更大的项目,遇到了一个我在这里以更简单的方式复制的问题。我要做的是将一个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   

有人可以向我解释这里发生了什么吗?也许建议解决这种情况。

1 个答案:

答案 0 :(得分:1)

您正在反复向test添加完全相同的对象ArrayList。这就是他们一起被修改的原因。

每次要添加时,都需要在添加之前创建new ArrayList<Integer>()

您可以尝试替换

test1.add(test);

test = new ArrayList<Integer>(test);
test1.add(test);

这会复制当前测试,然后将其添加到列表中。

这仍然意味着Integer中包含的ArrayList元素会出现相同的错误,因为这是一个浅层副本,但是由于你没有修改它们,所以这种情况可以。