int []数组的排列 - 添加到列表

时间:2016-02-27 20:51:42

标签: java arraylist permutation

我有一个算法来计算int数组的每个排列。在这种情况下 - 当我想打印这些排列时 - 一切正常。但是如果我想将数组保存到arraylist,它会保存正确的数量,但它只保存了一个相同的选项。我知道这个问题很简单,但我无法解决。谢谢你的帮助。

我添加方法printArray,然后将打印的数组保存到ArraylistprintArray的输出是正确的,但printList的输出是这样的:

1 2 3 4 5 6

and this input is printed n!, which is correct but its only one permutation

这是我的代码:

公共类Permute {

ArrayList<int[]> list;

public Permute() {
    list=new ArrayList<>();
}

void printArray(int[] a) {
    for (int i = 0; i < a.length; i++) {
        System.out.print(a[i] + " ");
    }
    System.out.println("");

    list.add(a);
}

void printList(){
    for(int[] arr:list){
        for(int item:arr){
            System.out.print(item+" ");
        }
        System.out.println("");
    }
}



void permute(int[] a, int k) {
    if (k == a.length)
        printArray(a);
    else {
        for (int i = k; i < a.length; i++) {
            int temp = a[k];
            a[k] = a[i];
            a[i] = temp;
            permute(a, k + 1);
            temp = a[k];
            a[k] = a[i];
            a[i] = temp;
        }
    }
}
public static void main(String[] args) {
    Permute p = new Permute();
    int a[] = {1, 2, 3, 4, 5, 6};
    p.permute(a, 0);
    p.printList();
}

}

1 个答案:

答案 0 :(得分:1)

您反复使用相同的数组。你重新安排里面的项目。

打印时没关系。但是当你将它保存在列表中时,保存的是数组 reference ,而不是数组内容。

所以你输入对同一个对象的引用n!进入清单的时间。在操作结束时,所有这些引用仍然引用相同的对象 - 打印列表将一次又一次地打印相同的数组,并使用最新的内容。

如果您想每次保存不同的内容,则需要制作阵列的副本,然后保存该副本。

因此,例如,您可以使用

list.add( Arrays.copyOf(a, a.length) );