簡體   English   中英

將元素添加到遞歸方法中作為參數接收的ArrayList嗎?

[英]Adding element to an ArrayList received as argument in recursive method?

我有一個方法來執行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]

因此,算法內部一切正常但僅添加了第一個排列。 為什么?

您是對的,它是ArrayList引用。 它總是指向內存中的同一對象,因此置換總是影響resultado中的所有數組。 (因為它們都是相同的參考)。

將添加行更改為:

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

而是將置換數組的副本添加到resultados,並為您提供期望的輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM