2016-10-05 3 views
1

が、私は私のクラスに次のコードがあります。何らかの理由でadd(elem)メソッドは、配列内のすべての要素をelemに変更しますか?

public static ArrayList<String[]> allCombos; 

public static void main(String[] args){ 
    allCombos = new ArrayList<String[]>(); 
    String[] arr = {"A","B","C","D","E","F"}; 
    combinations(arr, 3, 0, new String[3]); 

} 

static void combinations(String[] arr, int len, int startPosition, String[] result){ 
    if (len == 0){ 
     allCombos.add(result); // this is where the problem seems to be 
     return; 
    }  
    for (int i = startPosition; i <= arr.length-len; i++){ 
     result[result.length - len] = arr[i]; 
     combinations(arr, len-1, i+1, result); 
    } 
}  

allCombos.add(result)combinations()に呼び出されるたびに、この方法は、それによって、結果の現在の値に全体の配列内のすべての要素を1つ設定しているようです以前の反復でcombinations()が最後に追加された値をallCombosとして設定したことを乗り越えました。 allCombosVectorの場合も同じことが起こります。

なぜこれが起こっているのか、どのように修正できるのか誰にでも教えてください。

+1

you'reは専用文字列 'の1つのインスタンスでの作業[] 'この結果、このインスタンスは' List'で複数回beeingされますが、この 'Strin g []は複数回修正されます。 – SomeJavaGuy

答えて

5

同じresultアレイをArrayListに複数回追加すると、ArrayListには同じアレイオブジェクトへの複数の参照が含まれます。

ArrayListに別個の配列を格納するには、配列のコピーを作成する必要があります。

変更

allCombos.add(result); 

allCombos.add(Arrays.copyOf(result,result.length)); 

に、その変更を行う印刷した後、あなたのallCombosListができます:

[A, B, C] 
[A, B, D] 
[A, B, E] 
[A, B, F] 
[A, C, D] 
[A, C, E] 
[A, C, F] 
[A, D, E] 
[A, D, F] 
[A, E, F] 
[B, C, D] 
[B, C, E] 
[B, C, F] 
[B, D, E] 
[B, D, F] 
[B, E, F] 
[C, D, E] 
[C, D, F] 
[C, E, F] 
[D, E, F] 
関連する問題