【问题标题】:Adding element to an ArrayList received as argument in recursive method?在递归方法中将元素添加到作为参数接收的 ArrayList?
【发布时间】:2013-11-19 01:03:16
【问题描述】:

我有一个方法可以执行ArrayList 元素的排列,我给出一个 ArrayList 作为存储排列的参数。但是,它总是添加相同的项目。

我认为这个问题是 ArrayList reference

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]

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

【问题讨论】:

    标签: java recursion arraylist pass-by-reference


    【解决方案1】:

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

    将添加行更改为:

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

    会改为将置换数组的副本添加到 resultados,并为您提供您期望的输出。

    【讨论】:

      猜你喜欢
      • 2015-08-19
      • 2014-06-03
      • 2014-05-18
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多