因此,对于我的微积分课程中的额外学分问题,我的其他书呆子同学和我决定建立一个程序来强制解决问题。其中一个步骤涉及排列。通过这个算法,我设法让它工作(我认为):
public void genPermutations(int[] list, int k){
System.out.println("List: " + Arrays.toString(list));
System.out.println("----------------------");
if(k > list.length){
System.out.println("Not enough elements!");
return;
}
int[] counts = new int[list.length];
for(int i = 0; i < counts.length; i++){
counts[i] = 1;
}
int[] data = new int[k];
permutationHelper(list, counts, data, 0, k);
}
public void permutationHelper(int[] list, int[] counts, int[] data, int index, int k){
if(index == k){
//System.out.println(Arrays.toString(data));
permutations.add(data);
}else{
for(int i = 0; i < list.length; i++){
if(counts[i] == 0){
continue;
}
data[index] = list[i];
counts[i]--;
permutationHelper(list, counts, data, index + 1, k);
counts[i]++;
}
}
}
我有一个ArrayList
,它存储了所有可能的排列(作为整数数组),这些排列可以从我传递给函数的列表中的k个元素构成。问题是如果我在函数之外打印所有这些排列,比如在我调用genPermutations
函数之后,现在每个排列都是相同的。但是,当我打印出注释在permutationHelper
函数中的数据时,它会正确列出每个可能的排列;我以后无法在程序中访问它们。我的问题是为什么退出函数时值会发生变化?任何帮助将不胜感激。
以下是一些图片:
What is printed where the comment is.
What is printed later in the program.
用于打印函数外部所有内容的代码是:
for(int i = 0; i < permutations.size(); i++){
System.out.println(Arrays.toString(permutations.get(i)));
}
我真的不知道是否有必要知道,但我只是想我会包含它以防万一。提前谢谢。
答案 0 :(得分:1)
您不断修改同一个数组对象。您实际上是在反复添加对同一数组的引用,而不是向列表中添加不同的数组。
要修复此问题,您必须添加一个副本,而不是将a = [2,1,4,3,1,2,3,4,2,7,8,10,3,4]
a = merge_sort(a)
print(a)
out : [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 7, 8, 10]
数组添加到列表中。使用Arrays.copyOf()
:
data
答案 1 :(得分:0)
这里的问题是,在将array
添加到list
之后,您正在修改[3,2,1]
,您将在不同的迭代中反复修改同一个对象。您在list
中获得data
是因为这是上次迭代的结果。因此,作为修复,您可以使用以下代码。它的作用是创建int[] temp = Arrays.copyOf(data, data.length);
permutations.add(temp);
数组的副本并将其添加到列表中。
clone()
OR
您可以按如下方式使用数组中的int[] temp = data.clone();
permutations.add(temp);
。
onChange