add(elem)方法将我的数组中的每个元素都更改为elem?

时间:2016-10-05 05:48:17

标签: java recursion arraylist add combinations

我的课程中有以下代码:

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()时,该方法似乎将整个数组中的每个元素设置为结果的当前值,从而超越前一次迭代combinations()已设置allCombos的最近添加值。如果allCombosVector,则会发生同样的事情。

有人可以告诉我为什么会这样,以及我如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

您多次向ArrayList添加相同的ArrayList数组,因此ArrayList包含对同一数组对象的多个引用。

您应该创建数组的副本,以便allCombos.add(result); 包含不同的数组。

更改

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

allCombos

进行更改后,打印List [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] 即可:

RecyclerView