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

时间:2017-12-11 04:12:45

标签: java algorithm arraylist scope permutation

因此,对于我的微积分课程中的额外学分问题,我的其他书呆子同学和我决定建立一个程序来强制解决问题。其中一个步骤涉及排列。通过这个算法,我设法让它工作(我认为):

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

我真的不知道是否有必要知道,但我只是想我会包含它以防万一。提前谢谢。

2 个答案:

答案 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