ArrayList<ArrayList<Integer> returns 添加不同元素时的相同值

ArrayList<ArrayList<Integer> returns same values when adding different elements to it

我需要将排列列表添加到 ArrayList 类型,但对我来说,当我尝试在代码下方 运行 时,我会重复获得相同的值。请帮帮我。

public static void permutation(ArrayList<Integer> perm, ArrayList<ArrayList<Integer>> solution, int index) {
        if (index >= perm.size()) {
            solution.add(perm);
            return;
        }

        for (int i = index; i < perm.size(); i++) {
            Collections.swap(perm, index, i);
            permutation(perm, solution, index + 1);
            Collections.swap(perm, index, i);
        }

    }

如果将 [1,2,3] 作为第一个参数传递。 预期输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1 ]] 应该添加到第二个参数。 实际输出:[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3 ]]

public class GetAllPermutations {

public static void getPermutations(int[] array){  
    helper(array, 0);  
}  

private static void helper(int[] array, int pos){  
    if(pos >= array.length - 1){   
        System.out.print("[");  
        for(int i = 0; i < array.length - 1; i++){  
            System.out.print(array[i] + ", ");  
        }  
        if(array.length > 0)   
            System.out.print(array[array.length - 1]);  
        System.out.println("]");  
        return;  
    }  

    for(int i = pos; i < array.length; i++){   
      
        int t = array[pos];  
        array[pos] = array[i];  
        array[i] = t;  

        helper(array, pos+1);  

        t = array[pos];  
        array[pos] = array[i];  
        array[i] = t;  
    }  
}  
public static void main(String args[]) {  
    int[] numbers = {1, 2, 3};  
    getPermutations(numbers);  
}  

}

你需要明白

solution.add(perm);

不会将 perm 的副本添加到 solution - 它只会添加对 perm 的引用。您正在更改该行之后的内容 perm,这意味着似乎已添加到 solution 的任何内容也会更改(因为它是同一个对象)。

您需要做的是将 perm 的副本添加到 solution

在您的情况下,创建此类副本的最简单方法是创建 new ArrayList<Integer>(perm):

solution.add(new ArrayList<Integer>(perm));