Geschachtelte ArrayLists auslesen (nested ArrayList)

Valas

Grünschnabel
Servus ihr,

nachdem ich beim letzten Mal hier so gute Hilfe erhalten habe, wende ich mich erneut mit einem Problem an euch. Und zwar gestaltet sich das Auslesen zweier geschachtelter ArrayLists etwas schwierig. Ich ermittle für eine Spielsimulation die verschiedenen Paarungen für einen Spieltag und trage diese in eine ArrayList ein (listeDerSpiele). Dann trage ich diese Liste zusammen mit der Spieltagnummer in eine weitere ArrayList (spieltag) ein und leere nach dem Eintragen die Liste mit den Paarungen, um Platz für die Paarungen des nächsten Spieltags zu schaffen. Leider habe ich ein Problem mit dem Auslesen eben jener geschachtelten ArrayLists. Das liegt wohl unter anderem daran, dass ich nicht weiß, wie die innere ArrayList eigentlich namentlich anzusprechen ist und somit schon in der 2. for-Bedingung für das Auslesen etwas falsch zu sein scheint (for(int j = 0; j < listeDerSpiele.size(); j++). Das listeDerSpiele.size() scheint falsch zu sein, da diese ArrayList ja vorher geleert wurde. Ich bin davon ausgegangen, dass die innere ArrayList ihren Namen beibehält, aber scheinbar habe ich mich da getäuscht. In den Listen sind auf alle Fälle Objekte gespeichert. Beim Auslesen zeigt er mir jedoch keine Daten an (allerdings auch keine Fehlermeldung).

Für Tipps bezüglich des Problems wäre ich sehr dankbar.

Java:
public class Spieltag implements Serializable {
	private ArrayList<Spiel> listeDerSpiele = new ArrayList<Spiel>();
	private ArrayList<Spieltag> spieltag = new ArrayList<Spieltag>();
	private ArrayList<MeineMannschaft> mannschaften = new ArrayList<MeineMannschaft>();
	
	public void generiereSpieltag(ArrayList<MeineMannschaft> mannschaften) {
		for (int i = 1; i <= mannschaften.size() - 1 ; i++) {
				... (diverse Berechnungen zum Ermitteln der Paarungen)
			for (int l = 0; l < mannschaften.size() / 2; l++) {
				... (diverse Berechnungen zum Ermitteln der Paarungen)
			}
			
			listeDerSpiele.add(new Spiel(new MeineMannschaft(mannschaftsName), 
             new MeineMannschaft(mannschaftsName)));
		}
		spieltag.add(new Spieltag(i, listeDerSpiele));
		listeDerSpiele.clear();

		//Prüfe erstellte ArrayList
		for(int i = 0; i < spieltage.size(); i++) {
			System.out.println("\nSpieltag " + (i+1));
			for(int j = 0; j < listeDerSpiele.size(); j++) {
				System.out.println(spieltage.get(i).listeDerSpiele.get(j) + " - " + 
					spieltage.get(i).listeDerSpiele.get(j));
			}
		}
	}
}
 
Wenn ich das richtig sehe, musst du in der Klasse "Spieltag" eine Methode schreiben, die dir die Liste der Spiele zurück gibt. Die speicherst du dir in listeDerSpiele und gehst sie in der 2. for - Schleife durch. Etwa so:

Java:
for(int i = 0; i < spieltage.size(); i++) {
     System.out.println("\nSpieltag " + (i+1));
     listeDerSpiele = spieltage.get(i).getLISTE();
     for(int j = 0; j < listeDerSpiele.size(); j++) {
           System.out.println(listeDerSpiele.get(j) + " - " + listeDerSpiele.get(j)); 
           // die ausgabe stimmt so sicher nicht, also die macht nicht, was du willst
     }       
}
 
Zuletzt bearbeitet:
Dein Design ist glaub ich auch falsch. Du verwaltest in der Klasse Spieltag eine Liste von Spieltagen.
Sollte das nicht eher von einer Klasse Saison oder Turnier oder so gemacht werden?
 
Ja, das mit Design hab ich auch schon zig mal geändert. Zuerst war der ganze Kram in der Klasse Spielplan drin, aber irgendwie kam mir das auch falsch vor, also habe ich das nach Spieltag verschoben. Der Spielplan soll ne Liste von Spieltagen enthalten und die Spieltage eine Liste von Spielen. Soweit zur Idee. Der Part mit den Berechnungen zu den Mannschaftsbegegnungen ist wohl in der Klasse Spieltag richtig aufgehoben. Die ArrayList "ListeDerSpiele" muesste also in der Klasse generiert und via return zurückgegeben werden. Die Erstellung der einzelnen Spieltage müsste dann aber wohl in der Klasse Spielplan erfolgen (spieltage.add(new Spieltag(i, listeDerSpiele));). Wäre das Design dann so in der Art sinnvoller? Das Problem mit den geschachtelten ArrayLists konnte ich noch nicht lösen. Selbst mit einer eigenen Methode habe ich das gleiche Problem wie vorher. Wenn ich die ArrayList auslese erhalte ich ja theoretisch ein Objekt vom Typ Spieltag. Müsste ich dann nicht dadurch in der Lage sein, auf die einzelnen Werte via get zugreifen zu können (SpieltagNummer, ArrayList<Spiel>)? Könnte es sein, dass der Type-Cast falsch ist bzw falsch aufgerufen wurde?

Java:
for(Spieltag test : spieltage) {
			System.out.println(test);
		}

Durch diese Schleife erhalte ich folgende Ausgabe (wobei spieltage eine ArrayList vom Typ Spieltag ist):

Spieltag@66848c
Spieltag@8813f2
Spieltag@1d58aae

test.getClass() sagt mir an dieser Stelle, dass es sich um Objekte der Klasse Spieltag handelt. Viel mehr kann ich aber mit den Objekten in test nicht anfangen. Eclipse schlägt mir da keine Alternativen vor. Der Konstruktor sieht wie folgt aus:

Java:
public Spieltag(int spieltagNummer, ArrayList<Spiel> listeDerSpiele) {
		this.spieltagNummer = spieltagNummer;
		this.listeDerSpiele = listeDerSpiele;
	}

Wenn ich andere ArrayLists ansprechen (z.B. mannschaften vom Typ MeineMannschaft), dann kann ich z.B. mit mannschaften.get(0).getName() auf die Attribute zugreifen. Bei der ArrayList vom Typ Spiel will das einfach nicht klappen, egal was ich mache. Ich bekomme keine Option für ein get in Bezug auf Attribute.... Es scheint also irgendein entscheidender Faktor zu fehlen.... *narf*
 
Die Liste der Spieltage muss von einer übergeordneten Klasse verwaltet werden. Man kann sich darüber streiten, ob
der Spielplan jede Begegnung bestimmt oder der Spieltag. Sonst ist das so ok.

Spieltage müssen vom Spielplan erstellt werden. Die Klasse Spieltag enthält die liste der Begegnungen.

Wenn du jetzt noch in deiner Klasse Spieltag toString überschreibst sollte dir das richtige bei dem Sysout angezeigt werden. Z. Zt. ist das glaub ich ne Speicheradresse.

Java:
public String toString () {
      return spieltagNummer;
}
 
Zuletzt bearbeitet:
Ok, das mit den einzelnen Klassen werde ich dann dementsprechend noch anpassen. Deine Erklärung erscheint mir auch logisch und würde ja auch zu meiner Grundidee bei der Struktur passen. Inzwischen konnte ich auch das Problem mit den beiden ArrayLists etwas eingrenzen. Ich habe festgestellt, dass er mir in die Liste mit den Spieltagen korrekt neue Objekte mit zugehöriger SpieltagNummer anlegt:

Java:
spieltage.add(new Spieltag(i, listeDerSpiele));

Allerdings scheint der 2. Parameter noch etwas Probleme zu bereiten, da er mir lediglich eine leere Liste einträgt. Die Spiele werden folgendermaßen in eine eigene ArrayList übertragen:

Java:
listeDerSpiele.add(new Spiel(new MeineMannschaft(heimNummer, heim, heimOrt), 
						new MeineMannschaft(gastNummer, gast, gastOrt)));
System.out.println(listeDerSpiele.get(l).getMannschaftA().getMannschaftsName());

Das System.out dient hier lediglich dazu, die Werte in der ArrayList zu prüfen. Ich bekomme auch entsprechend die richtigen Mannschaftsnamen angezeigt. Demnach ist die ArrayList ja nicht leer, aber dennoch übernimmt er die gefüllte Liste nicht richtig beim Eintragen des Spieltags und trägt lediglich eine leere ArrayList ein. Mit getClass habe ich geprüft, welche Klasse die ArrayList besitzt. Da steht leider nur ArrayList und nicht Spiel (so wie ich es erwartet hätte).
 
Leider versteh ich jetzt nicht genau was das Problem ist. Hier ergibt sich aber wieder ein Fehler in deinem Design.
Eigentlich müsste man alle Mannschaften anlegen und dann dem Konstruktor des Spiels die richtigen Objekte übergeben.

Java:
listeDerSpiele.add(new Spiel(Mannschaft_1, Manmnschaft_2));
 
Erstmal danke für deine Bemühungen. Du hast Recht. Der Konstruktor war nicht ganz korrekt hier gepostet. Hatte den schon geändert, aber vorher schon hierher kopiert. Tatsächlich sieht es so aus:

Java:
listeDerSpiele.add(new Spiel(new MeineMannschaft(mannschaftsNameA),
             new MeineMannschaft(mannschaftsNameB)));

Die Mannschaftsobjekte stehen in einer ArrayList<MeineMannschaft> zur Verfügung und werden vor dem Eintragen ausgelesen, so dass der o.g. Code-Schnipsel immer die Parameter (Mannschaftsnamen) vorher übergeben bekommt. Dennoch übernimmt er die ArrayList nicht mit den korrekten Werten sondern trägt ein leere Liste in die 2. Liste ein. Ich hab keine Ahnung, wo das Problem liegt und ich bin schon am Verzweifeln... Die ArrayList mit den Spielen, die in Spieltage eingetragen wird, ist und bleibt beim Eintragen leer, obwohl sie vorher Werte enthielt...
 
Versuch es an der Stelle, wo du weisst, dass die Liste korrekt gefüllt ist mit einer setter Methode, die du an einem Spieltag-Objekt aufrufst.

z.B.
Java:
spieltag.setListeDerSpiele(listeDerSpiele)

... und in der Klasse Spieltag:

Java:
public void setListeDerSpiele(ArrayList<Spiele> liste)  {
   listeDerSpiele = liste;
}
 
Zuletzt bearbeitet von einem Moderator:
Ok, das mit dem Setter habe ich probiert. Leider hat das nicht funktioniert. Ich kann den Setter gar nicht erst aufrufen. Bin ja auch in der gleichen Klasse, von daher dürfte das schwierig werden. Habe es mit spieltag.set(index, element) probiert, um so einfach die Liste reinzuschreiben:

Java:
spieltage.set(i, listeDerSpiele);

Dummerweise bekomme ich da folgende Fehlermeldung:

The method set(int, Spieltag) in the type ArrayList<Spieltag> is not applicable for the arguments (int, ArrayList<Spiel>)

Irgendwo scheint da bei der Methode noch was falsch zu sein, sonst würde die wohl nicht int und Spieltag als Parameter erwarten.
 
Zurück