2017-03-29 5 views
0

Ich habe ein Projekt für die Schule zu tun, in dem ich eine rekursive Methode verwenden muss, die alle Umschaltmöglichkeiten zwischen einigen Zahlen berechnet. I.E: [1,2] => 1,2 und 2,1.ArrayList von int [] in einer rekursiven Methode

Also ich habe diese Methode verwendet und es schien richtig zu funktionieren, wenn ich nur die Lösungen auf der Konsole drucke, aber wenn ich die Registerkarten in einer ArrayList (ich muss sie später verwenden), wird es immer füge dieselbe Reihenfolge hinzu. In meinem Beispiel hätte es 1,2 und 1,2 anstelle von 1,2 und 2,1 hinzugefügt.

Hier ist mein Code:

public static void permute(int start, int[] input, ArrayList <int[]> al) { 
    //This method is recursive, it will open multiple instances of the input tab by calling itself and modify them, then stock tab in ArrayList when the operations are done for this tab. 
    //ArrayList must be empty. 

    //Printing tab if iterations for that specific tab are done 
    if (start == input.length) { 
     al.add(input); 
     //////////////////////////////// 
     // For printing tabs in console. 
     // for(int x: input){ 
     // System.out.print(x); 
     // } 
     // System.out.println(""); 
     //////////////////////////////// 
    //End the specific tab loop when it's printed 

    return; 
    } 
    for (int i = start; i < input.length; i++) { 
     // Changing numbers 
     int temp = input[i]; 
     input[i] = input[start]; 
     input[start] = temp; 

     ////////////////////////////////////////////////// 
     // Tests to see algorithm steps 
     // 
     // System.out.print("temp : " + temp + " ... "); 
     // System.out.print("i : "+i + " ... "); 
     // System.out.print("start : " + start); 
     // System.out.println(""); 
     // System.out.print("---"); 
     // for(int x: input){ 
     // System.out.print(x); 
     // } 
     // System.out.println(""); 
     ////////////////////////////////////////////////// 

     //Changing numbers 
     permute(start + 1, input, al); 

     // Changing numbers 
     int temp2 = input[i]; 
     input[i] = input[start]; 
     input[start] = temp2; 

} 

}

ich start = 0, Eingang = {1,2,3} und die Arraylist leer ist, bevor das Verfahren beginnt.

Hoffe, du kannst helfen, danke!

Antwort

1

Das Problem ist, dass Sie einen Verweis auf ein Array in Ihre ArrayList hinzufügen, Verweis, den Sie dann in Ihrem Algorithmus ändern.

Am Ende werden Sie Perm (N) Kopien des gleichen Arrays haben.

Alles, was Sie tun müssen, ist eine tief Kopie des Arrays in die Arraylist hinzuzufügen, wie folgt aus:

al.add(Arrays.copyOf(input, input.length)); 

statt

al.add(input); 

die resultierende Arraylist Drucken wird dann erzeugen die folgende Ausgabe:

[1, 2, 3] 
[1, 3, 2] 
[2, 1, 3] 
[2, 3, 1] 
[3, 2, 1] 
[3, 1, 2] 
+0

Dank Mann, es hat funktioniert! Aber kann ich Sie den Unterschied zwischen meiner Linie und der Deep-Kopie fragen? Ich meine, wann sollte ich die Deep-Copy über die Eingangsreferenz verwenden? –

+0

Sie möchten Deep-Copy immer dann verwenden, wenn Sie eine echte neue Kopie des Objekts erhalten möchten, anstatt nur eine Kopie der aktuellen Referenz auf das Objekt. Letzteres schützt Sie nicht vor anderem Code, der das zugrundeliegende Objekt durch den Verweis, den sie halten, verändert, genau was Sie hier ausgelöst hat. Um zu verstehen, warum dies notwendig ist, google nach "ist Java Pass by Reference oder Wert?" – Edd

Verwandte Themen