【问题标题】:The add(elem) method changes every element in my array to elem?add(element) 方法将我数组中的每个元素更改为元素?
【发布时间】:2016-10-05 05:48:17
【问题描述】:

我的课堂上有以下代码:

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);
    }
}       

由于某种原因,每次在combinations() 中调用allCombos.add(result) 时,该方法似乎将整个数组中的每个元素都设置为结果的当前值,从而覆盖了combinations() 的先前迭代已将最近添加的 allCombos 值设置为。如果allCombosVector,也会发生同样的事情。

谁能告诉我为什么会发生这种情况以及如何解决它?

【问题讨论】:

  • 您只使用String[] 的一个实例,因此导致此实例在List 中出现多次,而只有此String[] 被多次修改。

标签: java recursion arraylist add combinations


【解决方案1】:

您多次将相同的result 数组添加到您的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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    相关资源
    最近更新 更多