将元素添加到在递归方法中作为参数接收的ArrayList?

时间:2013-11-19 01:03:16

标签: java recursion arraylist pass-by-reference

我有一个执行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]

所以在算法中一​​切正常,但只添加了第一个排列。的 为什么?

1 个答案:

答案 0 :(得分:1)

你是正确的,它是ArrayList引用。它总是指向内存中的同一个对象,因此permute总是影响resultado中的所有数组。 (因为它们都是相同的参考)。

将添加行更改为:

resultados.add((ArrayList<Integer>)arr.clone());

会将置换数组的副本添加到resultados,并获得您期望的输出。