我有一个算法来计算int
数组的每个排列。在这种情况下 - 当我想打印这些排列时 - 一切正常。但是如果我想将数组保存到arraylist
,它会保存正确的数量,但它只保存了一个相同的选项。我知道这个问题很简单,但我无法解决。谢谢你的帮助。
我添加方法printArray
,然后将打印的数组保存到Arraylist
。
printArray
的输出是正确的,但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();
}
}
答案 0 :(得分:1)
您反复使用相同的数组。你重新安排里面的项目。
打印时没关系。但是当你将它保存在列表中时,保存的是数组 reference ,而不是数组内容。
所以你输入对同一个对象的引用n!进入清单的时间。在操作结束时,所有这些引用仍然引用相同的对象 - 打印列表将一次又一次地打印相同的数组,并使用最新的内容。
如果您想每次保存不同的内容,则需要制作阵列的副本,然后保存该副本。
因此,例如,您可以使用
list.add( Arrays.copyOf(a, a.length) );