Überschreiben von Variablen bei rekursivem Funktionsaufruf

koche82

Mitglied
Hallo Community,

ich benötige mal wieder eure Hilfe. Momentan arbeite ich an einer Analyse, die mir aus einem Mannschaftsteil die Kombination ermittelt, welche in der Vergangenheit am erfolgreichsten war. Der Mannschaftsteil besteht aus drei Spielern (3 Torhüter) und aus der Anzahl der möglichen Törhüter (knapp 60) habe ich 34220 mögliche Kombinationen ermittelt.

Bei der Ermittlung dieser Kombinationen versuche ich mir die Gesamtpunktezahl zu merken und zum Schluß das erfolgreichste Torhüter-Team auszugeben.

Jetzt das Problem:
Bei der Ermittlung dieser Kombinationen rufe ich eine Funktion rekursiv auf (Den Sourcecode habe ich mir aus einem 6 aus 49 Beispiel abgekuckt). Offensichtlich ist dieser rekursive Aufruf daran schuld, dass mir die Variable mit dem "besten Team" überschrieben wird, welcher ich vorher das beste Team zugewiesen habe. Anbei das Code Beispiel

Java:
import java.util.ArrayList;

import com.xyz.jsoupexample.Spieler;
import com.xyz.jsoupexample.Team;

public class TorhueterGenerator implements Runnable {
	private Team torhueterTeam;
	private int anzTeamTorhueter;
	private ArrayList<Spieler> spielerList = new ArrayList<Spieler>();
	private Team bestTeam;
	private int hoechstePunktzahl = 0;
	private int besteKombination = 0;

	int counter = 1;

	public TorhueterGenerator(int anzTeamTorhueter,
			ArrayList<Spieler> spielerList) {
		this.spielerList = spielerList;
		this.anzTeamTorhueter = anzTeamTorhueter;
		this.torhueterTeam = new Team(anzTeamTorhueter);
		this.bestTeam = new Team(anzTeamTorhueter);
	}

	private synchronized void print() {
		System.out.println();

		Spieler[] spieler = torhueterTeam.getSpielerListe();

		for (Spieler keeper : spieler) {
			System.out.print(keeper.getName() + " ");
		}

		System.out.println("Der Gesamtmarktwert: "
				+ torhueterTeam.getGesamtPunktzahl());

		System.out.println("Kombination " + counter++ + " Gesamtpunktzahl: "
				+ torhueterTeam.getGesamtPunktzahl());

		if (bestTeam.getGesamtPunktzahl() < torhueterTeam
				.getGesamtPunktzahl()) {
			hoechstePunktzahl = torhueterTeam.getGesamtPunktzahl();
			bestTeam.setSpielerListe(torhueterTeam.getSpielerListe());

		}
		for (Spieler keeper : bestTeam.getSpielerListe()) {
			System.out.print(keeper.getName() + " (Bestes Team) ");
		}

	}

	private void berechneTeamKombination(int offenePositionen, int start) {
		if (offenePositionen > 0) {
			for (int i = start; i < spielerList.size(); i++) {
				torhueterTeam.getSpielerListe()[torhueterTeam.getSpielerListe().length
						- offenePositionen] = this.spielerList.get(i);
				berechneTeamKombination(offenePositionen - 1, i + 1);
			}
		} else {
			print();
		}

	}

	public void run() {
		berechneTeamKombination(anzTeamTorhueter, 0);
	}
}

Ich habe den SourceCode gedebuggt und beim Aufruf des Abschnittes
Java:
torhueterTeam.getSpielerListe()[torhueterTeam.getSpielerListe().length
						- offenePositionen] = this.spielerList.get(i);

wird die Variable bestTeam überschrieben. Habt ihr eine Idee, warum das so ist? Selbst wenn ich der Funktion print() eine Kopie der Variable "torhueterTeam" übergebe, ändert sich nichts am Ergebnis

Anbei die Ausgabe der letzten print()-Aufrufe:

Grün Mielitz Wolf Der Gesamtmarktwert: 56
Kombination 34218 Gesamtpunktzahl: 56
Grün (Bestes Team) Mielitz (Bestes Team) Wolf (Bestes Team) Die hoechste Punktzahl: 56

Grün Strebinger Wolf Der Gesamtmarktwert: 8
Kombination 34219 Gesamtpunktzahl: 8
Grün (Bestes Team) Strebinger (Bestes Team) Wolf (Bestes Team) Die hoechste Punktzahl: 8

Mielitz Strebinger Wolf Der Gesamtmarktwert: 56
Kombination 34220 Gesamtpunktzahl: 56
Mielitz (Bestes Team) Strebinger (Bestes Team) Wolf (Bestes Team) Die hoechste Punktzahl: 56
 

stg

Top Contributor
Es wird nicht das Team überschrieben, sondern die Spielerliste, da du in beiden Teams die selbe Spielerliste-Referenz verwendest.

Wenn es nicht wirklich die IDENTISCHE Liste sein soll, die du setzt, dann erstelle beim setzen der Liste eine ganz neue. Etwa so

Java:
#.setSpielerListe(new ArrayList(#.getSpielerListe))

EDIT: Habs nur überflogen, ich hoffe das stimtm überhaupt, was ich da sage ... aber das Verhalten, das du beschreibst, deuett darauf hn.
 
Zuletzt bearbeitet:

DrZoidberg

Top Contributor
Hier mal ein paar Tips, die das Schreiben von komplexen Programmen stark vereinfachen und die Fehleranfälligkeit reduzieren.

Alle Variablen, die man lokal definieren kann, sollte man nicht zu Instanzvariablen machen. In deinem Fall benötigst du nur zwei Instanzvariablen - anzTeamTorhueter und spielerList. Der Rest kann lokal (also innerhalb einer Methode) definiert werden.

Pack nicht zu viel in eine Methode. print() und bestimmeBestesTeam() sollten zwei verschiedene Methoden sein. berechneTeamKombination() sollte lediglich die Team Kombinationen berechen, aber nicht print aufrufen.

Wenn ein Objekt eine veränderbare Datenstruktur enthält, z.B. ein Array, dann sollte es keine Methode geben, die dieses Array zurückliefert. Denn ein Objekt sollte immer die volle Kontrolle über den eigenen Zustand haben. Gib also immer nur eine Kopie des Arrays zurück.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Überschreiben von Variablen Allgemeine Java-Themen 3
LimDul XSD To Java - Überschreiben von Assoziationen Allgemeine Java-Themen 1
C Überschreiben mit kontravariante Parameter Allgemeine Java-Themen 13
T Überschreiben von Methoden Allgemeine Java-Themen 6
MQue Spezialfrage Überschreiben von Methoden Allgemeine Java-Themen 14
M Überschreiben der clone()-Methode Allgemeine Java-Themen 10
A OOP: Überschreiben/Implementierung von Methoden Allgemeine Java-Themen 5
T Überschreiben von Methoden erzwingen Allgemeine Java-Themen 20
T Direktes Überschreiben Allgemeine Java-Themen 7
vogella Überschreiben von equals und hashcode für Collection Allgemeine Java-Themen 7
M Überschreiben? Allgemeine Java-Themen 3
A FileChooser Datei-Überschreiben Abfrage Allgemeine Java-Themen 2
K Überschreiben von 'static'-Methoden hat anderes Verhalten? Allgemeine Java-Themen 2
C Erste Schritte Variablen in abhängigkeit von Git branch Allgemeine Java-Themen 7
Fabiator Variablen Variablen Zählen Allgemeine Java-Themen 3
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
berserkerdq2 Labels in IJVM sind keine lokalen Variablen oder? Allgemeine Java-Themen 2
O Fehler bei Variablen Allgemeine Java-Themen 2
N File Path mit Variablen angeben Allgemeine Java-Themen 1
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
R Geometry erstellen die abhängig von Variablen ist Allgemeine Java-Themen 6
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
P static Blocks und variablen Allgemeine Java-Themen 41
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
V Datentypen Graphikrechner 2/Strings und Variablen in Doubles umwandeln Allgemeine Java-Themen 6
S Kann man Variablen oder Felder definieren deren Typ zwei Interfaces ist..? Allgemeine Java-Themen 9
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
D BlueJ, Variablen die mehrfach vorkommen gleichzeitig umbenennen Allgemeine Java-Themen 3
C Variablen Variablen mit unendlichem Wert Allgemeine Java-Themen 22
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
T Maximale Felder maximale Variablen Allgemeine Java-Themen 2
W Lebendige Variablen herauslesen Allgemeine Java-Themen 1
K Summierung einer Variablen Allgemeine Java-Themen 5
B Gibt es eine Funktion die den Datentyp einer Variablen ermittelt? Allgemeine Java-Themen 8
X Threads Externe Variablen in Run Methoden verändern Allgemeine Java-Themen 4
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
K Static Variablen verbieten Allgemeine Java-Themen 10
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6
J Text lesen und in Variablen speichern Allgemeine Java-Themen 3
A Best Practice Variablen vertauschen - Performance Allgemeine Java-Themen 1
F Variablen Variablen schachteln Allgemeine Java-Themen 6
7 6 int variablen vergleichen Allgemeine Java-Themen 34
C Threads Variablen in einem Thread Aktualisieren Allgemeine Java-Themen 17
M Variablen Variablen in Text einbinden Allgemeine Java-Themen 5
R Übergreifende Variablen? Allgemeine Java-Themen 10
OnDemand Input/Output Variablen in Datei Speichern um sie wieder auszulesen Allgemeine Java-Themen 4
D Variablen zur Laufzeit global speichern (Registry Pattern?) Allgemeine Java-Themen 6
iB0T "goto" Befehl aus Batch in Java und Variablen wert immer wieder neu setzen Allgemeine Java-Themen 4
D ClassLoader für Variablen einer Klasse setzen Allgemeine Java-Themen 24
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
D Alle Variablen final setzen ? Allgemeine Java-Themen 26
C Kapselung Warum graift man auf Variablen nur über Methoden und nich direkt zu? Allgemeine Java-Themen 10
C Classloading und statische Variablen Allgemeine Java-Themen 2
K Variablen speichern Allgemeine Java-Themen 2
S Variablen bei Aufruf zurücksetzen Allgemeine Java-Themen 4
faetzminator statische Variablen in Interface - Vererbung? Allgemeine Java-Themen 9
V Gibt es einen Variablen Cast? Allgemeine Java-Themen 8
K Mehrere JVMs die auf eine Klasse mit statischen Variablen zugreift Allgemeine Java-Themen 19
D Wann sollte ich statische Methoden und Variablen benutzen? Allgemeine Java-Themen 44
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
J Statische Variablen, Threadübergreifend. Allgemeine Java-Themen 4
E Variablen anderer Klassen auslesen (nur Name bekannt) Allgemeine Java-Themen 4
P Variablen in einer anderen Klasse auf Änderungen überwachen Allgemeine Java-Themen 12
V Typargument einer Variablen erfragen Allgemeine Java-Themen 4
B Rechnen mit mehreren Variablen Allgemeine Java-Themen 2
G Thread variablen Sichtbarkeit Allgemeine Java-Themen 15
J Java Pfad nicht mehr in Path Variablen??? Allgemeine Java-Themen 2
T Mit JNI finale Variablen überschreiben Allgemeine Java-Themen 14
T JNI -> auf Java-Variablen etc zugreifen Allgemeine Java-Themen 6
M Bezeichnung für Component-Variablen Allgemeine Java-Themen 6
M Variablen an Java-Programm übergeben Allgemeine Java-Themen 3
Airwolf89 dynamischer Zugriff auf Variablen/ Objekte Allgemeine Java-Themen 4
A Überschreibung von Variablen Allgemeine Java-Themen 3
A JavaCC: Variablen zaehlen Allgemeine Java-Themen 12
B globale und lokale Variablen Allgemeine Java-Themen 17
G referenz von variablen Allgemeine Java-Themen 9
O getRuntime().Exec() - Environment - Variablen setzen? Allgemeine Java-Themen 2
S XML-Parsing / public-Member-Variablen / Design-Frage Allgemeine Java-Themen 8
M Variablen Speicher wieder freigeben ? Allgemeine Java-Themen 9
N Variablen eines Objektes (instanz) in einen Array lesen Allgemeine Java-Themen 7
S In Subklasse auf private Variablen zugreifen Allgemeine Java-Themen 4
S Variablen und ihre Tücken. Allgemeine Java-Themen 7
C Binärbereich einer Variablen abfragen Allgemeine Java-Themen 8
J Zugriff auf den Namen einer Variablen Allgemeine Java-Themen 7
C dynamische variablen Namen! Allgemeine Java-Themen 4
M Int und String Variablen verändern Allgemeine Java-Themen 10
H zwei Date Variablen überschreiben sich Allgemeine Java-Themen 2
G Taushen der Input variablen einer method Allgemeine Java-Themen 14
P Objekt- Variablen Allgemeine Java-Themen 16
K Environment Variablen per java -D weitergeben Allgemeine Java-Themen 9
D in class-Dateien nach variablen suchen! Allgemeine Java-Themen 5
F Werte von Member-Variablen erst im Konstruktor setzen? Allgemeine Java-Themen 7
T Größe eine Variablen in Bytes? Allgemeine Java-Themen 22
B Reguläre ausdrücke mit variablen? Allgemeine Java-Themen 12
MQue JButton an verschiedenen Variablen Allgemeine Java-Themen 2
T Unabhängigkeit von Variablen/ Objekten. Allgemeine Java-Themen 6
G Frage zu statischen Variablen bei Vererbung Allgemeine Java-Themen 15
L Sichtbarkeit von Variablen / getMethode Allgemeine Java-Themen 4
H Variablen (A1, A2, A3 mit A_irgendetwas aufrufen) ohne Array Allgemeine Java-Themen 5

Ähnliche Java Themen


Oben