方法中的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]]
我可以做些什么来修复此问题,以便将打印的结果保存在完整列表中
# 1 楼答案
只要做:
full_list.add(new ArrayList<Integer>(arr));
代码中的错误是每次添加相同的
ArrayList
,但必须创建它的副本。此代码正在创建副本new ArrayList<Integer>(arr)
# 2 楼答案
您正在更改添加到
full_list
的arr
的值。要防止出现这种情况,应将arr
的新克隆添加到full_list
: