我有一个执行ArrayList
元素排列的方法,我给出一个ArrayList作为存储排列的参数。但是,它总是添加相同的项目。
我认为这个问题是ArrayList 引用。
public class TSP {
static ArrayList permute(ArrayList<Integer> arr, int k, ArrayList<ArrayList<Integer>> resultados) {
for(int i = k; i < arr.size(); i++){
java.util.Collections.swap(arr, i, k);
permute(arr, k+1, resultados);
java.util.Collections.swap(arr, k, i);
}
if (k == arr.size() -1){
System.out.println("Permute method: "+arr.toString());
resultados.add(arr);
}
return resultados;
}
public static void main (String[] args) {
ArrayList<Integer> ciudades = new ArrayList<>();
ciudades.add(1);
ciudades.add(2);
ciudades.add(3);
ArrayList<ArrayList<Integer>> resultados = new ArrayList();
resultados = permute(ciudades, 0, resultados);
for (ArrayList<Integer> resultado : resultados) {
System.out.println(resultado.toString());
}
}
}
执行的输出是:
置换法:[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]
所以在算法中一切正常,但只添加了第一个排列。的 为什么?
答案 0 :(得分:1)
你是正确的,它是ArrayList引用。它总是指向内存中的同一个对象,因此permute总是影响resultado中的所有数组。 (因为它们都是相同的参考)。
将添加行更改为:
resultados.add((ArrayList<Integer>)arr.clone());
会将置换数组的副本添加到resultados,并获得您期望的输出。