gpt4 book ai didi

java - 数据在哪里变化? - Java 中的排列

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:11:46 25 4
gpt4 key购买 nike

因此,对于我微积分课上的这个额外学分问题,我和我的其他 Nerd 同学决定构建一个程序来暴力解决问题。这些步骤之一涉及排列。通过这个算法,我设法让它工作(我认为):

    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)));
}

我真的不知道这是否有必要知道,但我只是想以防万一。提前致谢。

最佳答案

您不断地修改同一个数组对象。您实际上不是在列表中添加不同的数组,而是在一遍又一遍地添加对同一数组的引用。

要修复,而不是将 data 数组添加到您的列表中,您必须添加它的副本,例如使用 Arrays.copyOf() :

permutations.add(Arrays.copyOf(data, data.length));

关于java - 数据在哪里变化? - Java 中的排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47746331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com