java - add(element) 方法将数组中的每个元素更改为元素?

标签 java recursion arraylist addition combinations

我的类(class)中有以下代码:

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

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

最佳答案

您多次将相同的 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]

关于java - add(element) 方法将数组中的每个元素更改为元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39866276/

相关文章:

algorithm - 返回单向链表尾部(或末尾)的第 k 个元素

java - 比较和更新两个arraylist java android

java - 像间隔 java 一样将元素插入到 ArrayList

java - Groovy 中的 ArrayList 如何保存不同类型的值?

java - 在 Java 中接收时 TCP 套接字挂起

algorithm - Delphi 图形的非递归深度优先搜索

php - 如何在递归函数中显示php mysql中的所有结果

java - hibernate 时从 parent 到 child 的ID

java - 使用 Objectify4 进行祖先查询

java - System.exit(1) 而不是 return