保存到方法内的arraylist-意外结果

gr8qqesn  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(334)

这个问题在这里已经有答案了

为什么我的arraylist包含添加到列表中的最后一项的n个副本(5个答案)
两年前关门了。
我正在试图保存一个排列列表,以便稍后在我的程序中使用。但是,当我尝试将排列结果附加到完整的\u列表时,原始列表会一次又一次地保存到列表中。但是从system.out.println(arr)打印的结果;正是我想要的。

import java.util.*;

public class mytest {

    public static void main(String[] args){
        ArrayList<Integer> inlist = new ArrayList<Integer>();
        inlist.add(1);
        inlist.add(2);
        inlist.add(3);
        permute(inlist, 0);
        System.out.println(full_list);
    }

    public static HashSet<ArrayList<Integer>> full_list = new HashSet<ArrayList<Integer>>();

    public static void permute(ArrayList<Integer> arr, int k){

        for(int i = k; i < arr.size(); i++){
            java.util.Collections.swap(arr, i, k);
            permute(arr, k+1);
            java.util.Collections.swap(arr, k, i);
        }
        if (k == arr.size() -1){
            System.out.println(arr);
            full_list.add(arr);
        }
    }
}

系统输出打印结果(arr);

[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 2, 1]
[3, 1, 2]

在主方法中打印完整\u列表的结果:

[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]

我能做些什么来解决这个问题,以便打印的结果保存在完整的\u列表中?

jtjikinw

jtjikinw1#

只要做: full_list.add(new ArrayList<Integer>(arr)); 代码中的错误是您正在添加相同的 ArrayList 每次,但你必须创建一个副本。此代码正在创建副本 new ArrayList<Integer>(arr)

rfbsl7qr

rfbsl7qr2#

您正在更改的值 arr 正在增加 full_list . 要防止这种情况,您应该添加的新克隆 arrfull_list :

full_list.add(new ArrayList<>(arr));

相关问题