Permutation und Listen

  • Themenstarter Themenstarter Skara
  • Beginndatum Beginndatum
S

Skara

Gast
Hallo,

Ich habe ein für mich als Java-Anfänger merkwürdiges Problem:

Meine Aufgabe ist es, eine Klasse
Code:
public static <T> List<LinkedList<T>> perm(List<T> values) {...
so zu schreiben, dass alle Permutationen als Liste in einer LinkedList ausgeben werden. Dabei werden die Elemente mit "values" übergeben.
Im Prinzip könnte das alles ganz gut funktioren, aber aus irgendeinem Grund werden nach Zeile 20, wo die Elemente getauscht werden, alle Listenelemente aus "result" zu dem aktuellen "values"-Element umgewandelt. Das soll heißen, dass wenn zum Beispiel als erstes [1,2,3] zu "result" hinzugefügt wurde und gerade "values" zu [2,1,3] vertauscht wurde, plötzlich auch alle Elemente aus "result" zu [2,1,3] werden. Das geht die ganze Zeit bis zum Ende der Funktion so weiter bis am Ende so etwas rauskommt wie
Code:
[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
.
Gebe ich die Zwischenergebne allerdings direkt per print aus kann ich die richtigen Permutationen auslesen.

Warhscheinlich ist es recht schwer nachzuvollziehen, was mein Quelltext bedeuten soll und was ich überhaupt will, aber vielleicht hat jemand eine tolle Idee 😉


Java:
import java.util.*;
public class permutations {
	public static <T> List<LinkedList<T>> perm(List<T> values) {
	    int count;
		List<LinkedList<T>> result = new LinkedList<LinkedList<T>>();
		if (values.size()==0) return result;
		count = values.size()-1;
		return permhilf(values, count, result) ;
		
		
	}

	
	public static <T> List<LinkedList<T>> permhilf(List<T> values, int count, List<LinkedList<T>> result) {
		if (count==0){
			result.add(0, (LinkedList<T>) values);
		} else
			
			{
				permhilf(values, count-1, result);
				for (int i=0; i<=count-1; i++){
					swap(values, i, count);
					permhilf(values, count-1,result);
					swap(values, i, count);
				}
			}
		return result;
	}
	
	static <T> void swap(List<T> values, int i, int j) {
		T temp = values.get(i);
		values.set(i,(values.get(j)));
		values.set(j,temp);
	
	}
	
	
	public static void main (String [] args) {
		List<Integer> test = new LinkedList<Integer>();
		test.add(1);
		test.add(2);
		test.add(3);
		System.out.println(perm(test));
		
	}
}
 
Das "values", was da rumregeicht wird, ist eine Referenz. Diese Referenz zeigt immer auf EIN und dieSELBE Liste. Am Ende liegt in der Liste einfach x mal dieSELBE liste. Sowas wie
result.add(0, (LinkedList<T>) values);
ändern in
result.add(0, new LinkedList<T>(values));
sollte schon helfen: Da wird jedes mal eine neue LinkedList in die Liste gelegt (und diese LinkedList enthält die "values", wie sie zu diesem Zeitpunkt eben angeordnet sind)
 
Ja, natürlich! Ich glaube auf die Idee wäre ich morgen noch nicht gekommen =P
Ich danke dir vielmals für deine Hilfe.

Gruß,
Skara.
 

Zurück
Oben