有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

方法中的java保存到ArrayList意外结果

我正试图保存一个排列列表,以便以后在我的程序中使用。但是,当我尝试将排列结果附加到完整的列表时,原始列表会一次又一次地保存到列表中。但结果是从系统打印出来的。出来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);
        }
    }
}

系统的结果。出来println(arr)

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

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

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

我可以做些什么来修复此问题,以便将打印的结果保存在完整列表中


共 (2) 个答案

  1. # 1 楼答案

    只要做:full_list.add(new ArrayList<Integer>(arr));

    代码中的错误是每次添加相同的ArrayList,但必须创建它的副本。此代码正在创建副本new ArrayList<Integer>(arr)

  2. # 2 楼答案

    您正在更改添加到full_listarr的值。要防止出现这种情况,应将arr的新克隆添加到full_list

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