ArrayList<ArrayList<Integer> returns 添加不同元素时的相同值
ArrayList<ArrayList<Integer> returns same values when adding different elements to it
我需要将排列列表添加到 ArrayList 类型,但对我来说,当我尝试在代码下方 运行 时,我会重复获得相同的值。请帮帮我。
public static void permutation(ArrayList<Integer> perm, ArrayList<ArrayList<Integer>> solution, int index) {
if (index >= perm.size()) {
solution.add(perm);
return;
}
for (int i = index; i < perm.size(); i++) {
Collections.swap(perm, index, i);
permutation(perm, solution, index + 1);
Collections.swap(perm, index, i);
}
}
如果将 [1,2,3] 作为第一个参数传递。
预期输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1 ]] 应该添加到第二个参数。
实际输出:[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3 ]]
public class GetAllPermutations {
public static void getPermutations(int[] array){
helper(array, 0);
}
private static void helper(int[] array, int pos){
if(pos >= array.length - 1){
System.out.print("[");
for(int i = 0; i < array.length - 1; i++){
System.out.print(array[i] + ", ");
}
if(array.length > 0)
System.out.print(array[array.length - 1]);
System.out.println("]");
return;
}
for(int i = pos; i < array.length; i++){
int t = array[pos];
array[pos] = array[i];
array[i] = t;
helper(array, pos+1);
t = array[pos];
array[pos] = array[i];
array[i] = t;
}
}
public static void main(String args[]) {
int[] numbers = {1, 2, 3};
getPermutations(numbers);
}
}
你需要明白
solution.add(perm);
不会将 perm
的副本添加到 solution
- 它只会添加对 perm
的引用。您正在更改该行之后的内容 perm
,这意味着似乎已添加到 solution
的任何内容也会更改(因为它是同一个对象)。
您需要做的是将 perm
的副本添加到 solution
。
在您的情况下,创建此类副本的最简单方法是创建 new ArrayList<Integer>(perm)
:
solution.add(new ArrayList<Integer>(perm));
我需要将排列列表添加到 ArrayList 类型,但对我来说,当我尝试在代码下方 运行 时,我会重复获得相同的值。请帮帮我。
public static void permutation(ArrayList<Integer> perm, ArrayList<ArrayList<Integer>> solution, int index) {
if (index >= perm.size()) {
solution.add(perm);
return;
}
for (int i = index; i < perm.size(); i++) {
Collections.swap(perm, index, i);
permutation(perm, solution, index + 1);
Collections.swap(perm, index, i);
}
}
如果将 [1,2,3] 作为第一个参数传递。 预期输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1 ]] 应该添加到第二个参数。 实际输出:[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3 ]]
public class GetAllPermutations {
public static void getPermutations(int[] array){
helper(array, 0);
}
private static void helper(int[] array, int pos){
if(pos >= array.length - 1){
System.out.print("[");
for(int i = 0; i < array.length - 1; i++){
System.out.print(array[i] + ", ");
}
if(array.length > 0)
System.out.print(array[array.length - 1]);
System.out.println("]");
return;
}
for(int i = pos; i < array.length; i++){
int t = array[pos];
array[pos] = array[i];
array[i] = t;
helper(array, pos+1);
t = array[pos];
array[pos] = array[i];
array[i] = t;
}
}
public static void main(String args[]) {
int[] numbers = {1, 2, 3};
getPermutations(numbers);
}
}
你需要明白
solution.add(perm);
不会将 perm
的副本添加到 solution
- 它只会添加对 perm
的引用。您正在更改该行之后的内容 perm
,这意味着似乎已添加到 solution
的任何内容也会更改(因为它是同一个对象)。
您需要做的是将 perm
的副本添加到 solution
。
在您的情况下,创建此类副本的最简单方法是创建 new ArrayList<Integer>(perm)
:
solution.add(new ArrayList<Integer>(perm));