Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 堆';s算法在列表中的实现_Java_Algorithm_Arraylist_Data Structures - Fatal编程技术网

Java 堆';s算法在列表中的实现

Java 堆';s算法在列表中的实现,java,algorithm,arraylist,data-structures,Java,Algorithm,Arraylist,Data Structures,我正在使用Heap的算法创建一个列表列表,其中包含所述列表的每个排列。每个排列都将是它自己的列表。当我在算法中打印它时,它可以正常工作,但是当我尝试将它添加到列表列表时,它不能正常工作,并且它们都是相同的数组(4,1,2,3)。我注释掉了我测试的打印,以确保它正常工作 我当前的代码: public static ArrayList<int[]> lists = new ArrayList<>(); public static void main(String[] arg

我正在使用Heap的算法创建一个列表列表,其中包含所述列表的每个排列。每个排列都将是它自己的列表。当我在算法中打印它时,它可以正常工作,但是当我尝试将它添加到列表列表时,它不能正常工作,并且它们都是相同的数组(4,1,2,3)。我注释掉了我测试的打印,以确保它正常工作

我当前的代码:

public static ArrayList<int[]> lists = new ArrayList<>();

public static void main(String[] args) {
    int[] list = {1,2,3,4};
    heapsAlgorithm(4,list);
    for(int i = 1; i <= lists.size(); i++) {
        System.out.println("List " + i + ": " + Arrays.toString(lists.get(i-1)));
    }
}

public static void heapsAlgorithm(int n, int[] list) {
    if (n == 1) {
        lists.add(list);
        //System.out.println(Arrays.toString(list));
    }
    else {
        for(int i = 0; i < n; i++) {
            heapsAlgorithm(n - 1, list);
            if ( n % 2 == 0) {
                int swap = list[i];
                list[i] = list[n-1];
                list[n-1] = swap;
            }
            else {
                int swap = list[0];
                list[0] = list[n-1];
                list[n-1] = swap;
            }
        }
    }
}
输出不正确:

List 1: [4, 1, 2, 3]
List 2: [4, 1, 2, 3]
List 3: [4, 1, 2, 3]
List 4: [4, 1, 2, 3]
List 5: [4, 1, 2, 3]
List 6: [4, 1, 2, 3]
List 7: [4, 1, 2, 3]
List 8: [4, 1, 2, 3]
List 9: [4, 1, 2, 3]
List 10: [4, 1, 2, 3]
List 11: [4, 1, 2, 3]
List 12: [4, 1, 2, 3]
List 13: [4, 1, 2, 3]
List 14: [4, 1, 2, 3]
List 15: [4, 1, 2, 3]
List 16: [4, 1, 2, 3]
List 17: [4, 1, 2, 3]
List 18: [4, 1, 2, 3]
List 19: [4, 1, 2, 3]
List 20: [4, 1, 2, 3]
List 21: [4, 1, 2, 3]
List 22: [4, 1, 2, 3]
List 23: [4, 1, 2, 3]
List 24: [4, 1, 2, 3]

我假设我使用的ArrayList是错误的,但我不确定在哪里。有什么建议吗?

您需要复制int数组

您有一个数组的可变实例和数组列表,您假定这些数组将保留您的排列。基本上,发生了什么:

  • 你做排列
  • 将排列添加到ArrayList中
  • 你在同一个物体上做另一个排列
  • 将已在此列表中的对象添加到ArrayList

  • 最后是ArrayList,其中20次添加了相同的int数组。

    您需要将数组的副本添加到列表中:
    lists.add(Arrays.copyOf(list,list.length))
    。谢谢!成功了。为什么添加数组副本比直接添加数组更有效?因为向列表中添加数组(通常是任何东西)并不会复制它:您只是存储一个引用。因此,对列表“外部”数组的任何更新都是对列表“内部”相同数组的更新。这不是Heap算法的正确实现。你可能被Geeksforgeks网站误导了,这是完全错误的,或者在维基百科页面被认为自己更了解的人污损的时候查看,通常是因为他们查看了另一个错误的网站。Heap的算法在每次迭代中只交换两个元素。错误的实施不符合此限制;参见第七步,从3,2,1,4转换为4,2,3,1,这显然不是一次交换,因为三个元素已移动。参见
    List 1: [4, 1, 2, 3]
    List 2: [4, 1, 2, 3]
    List 3: [4, 1, 2, 3]
    List 4: [4, 1, 2, 3]
    List 5: [4, 1, 2, 3]
    List 6: [4, 1, 2, 3]
    List 7: [4, 1, 2, 3]
    List 8: [4, 1, 2, 3]
    List 9: [4, 1, 2, 3]
    List 10: [4, 1, 2, 3]
    List 11: [4, 1, 2, 3]
    List 12: [4, 1, 2, 3]
    List 13: [4, 1, 2, 3]
    List 14: [4, 1, 2, 3]
    List 15: [4, 1, 2, 3]
    List 16: [4, 1, 2, 3]
    List 17: [4, 1, 2, 3]
    List 18: [4, 1, 2, 3]
    List 19: [4, 1, 2, 3]
    List 20: [4, 1, 2, 3]
    List 21: [4, 1, 2, 3]
    List 22: [4, 1, 2, 3]
    List 23: [4, 1, 2, 3]
    List 24: [4, 1, 2, 3]