0

私はより大きなプロジェクトに取り組んでおり、ここでより簡単な方法で再現した問題に遭遇しました。私がやろうとしているのは、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   

誰かがここで何が起こっているのか説明できますか? そして、おそらくそのような状況の回避策を提案してください。

4

1 に答える 1

2

まったく同じオブジェクトtestArrayList何度も追加しています。これが、それらがすべて一緒に変更されている理由です。

new ArrayList<Integer>()追加するたびに、追加する前にを作成する必要があります。

交換してみることができます

test1.add(test);

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

これにより、現在のテストのコピーが作成され、リストに追加されます。

Integerこれは、浅いコピーであるため、 に含まれる要素が同じバグを示すことを意味しますが、要素ArrayListを変更していないため、この場合は問題ありません。

于 2013-08-10T02:22:27.920 に答える