tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
1063
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Valas Valas ist offline Mitglied
    Registriert seit
    Jan 2010
    Beiträge
    10
    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.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    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));
                }
            }
        }
    }
     

  2. #2
    FrankBooth FrankBooth ist offline Mitglied Gold
    Registriert seit
    Sep 2008
    Ort
    Osnabrück (Niedersachsen)
    Beiträge
    244
    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:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    
    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
         }       
    }
    Geändert von FrankBooth (14.01.10 um 15:17 Uhr)
     

  3. #3
    FrankBooth FrankBooth ist offline Mitglied Gold
    Registriert seit
    Sep 2008
    Ort
    Osnabrück (Niedersachsen)
    Beiträge
    244
    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?
     

  4. #4
    Valas Valas ist offline Mitglied
    Registriert seit
    Jan 2010
    Beiträge
    10
    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?

    Code java:
    1
    2
    3
    
    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:

    Code java:
    1
    2
    3
    4
    
    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*
     

  5. #5
    FrankBooth FrankBooth ist offline Mitglied Gold
    Registriert seit
    Sep 2008
    Ort
    Osnabrück (Niedersachsen)
    Beiträge
    244
    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.

    Code java:
    1
    2
    3
    4
    
     
    public String toString () {
          return spieltagNummer;
    }
    Geändert von FrankBooth (14.01.10 um 18:40 Uhr)
     

  6. #6
    Valas Valas ist offline Mitglied
    Registriert seit
    Jan 2010
    Beiträge
    10
    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:

    Code java:
    1
    
    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:

    Code java:
    1
    2
    3
    
    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).
     

  7. #7
    FrankBooth FrankBooth ist offline Mitglied Gold
    Registriert seit
    Sep 2008
    Ort
    Osnabrück (Niedersachsen)
    Beiträge
    244
    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.

    Code java:
    1
    
    listeDerSpiele.add(new Spiel(Mannschaft_1, Manmnschaft_2));
     

  8. #8
    Valas Valas ist offline Mitglied
    Registriert seit
    Jan 2010
    Beiträge
    10
    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:

    Code java:
    1
    2
    
    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...
     

  9. #9
    FrankBooth FrankBooth ist offline Mitglied Gold
    Registriert seit
    Sep 2008
    Ort
    Osnabrück (Niedersachsen)
    Beiträge
    244
    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.
    Code java:
    1
    
    spieltag.setListeDerSpiele(listeDerSpiele)

    ... und in der Klasse Spieltag:

    Code java:
    1
    2
    3
    
    public void setListeDerSpiele(ArrayList<Spiele> liste)  {
       listeDerSpiele = liste;
    }
     

  10. #10
    Valas Valas ist offline Mitglied
    Registriert seit
    Jan 2010
    Beiträge
    10
    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:

    Code java:
    1
    
    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.
     

  11. #11
    FrankBooth FrankBooth ist offline Mitglied Gold
    Registriert seit
    Sep 2008
    Ort
    Osnabrück (Niedersachsen)
    Beiträge
    244
    Du solltest ersteinmal die gesamte Struktur deines Programms so ändern, wie es am Ende auch aussehen sollte. Dann können wir weiter arbeiten!
     

Ähnliche Themen

  1. Antworten: 29
    Letzter Beitrag: 26.12.07, 23:10
  2. Baumstruktur ohne Nested-Sets auslesen
    Von chris_sit im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 21.12.06, 09:24
  3. Inhalt einer ArrayList in andere ArrayList kopieren
    Von Pierre im Forum .NET Archiv
    Antworten: 2
    Letzter Beitrag: 05.07.05, 16:58
  4. Aus einem Arraylist den größten Wert auslesen
    Von Planet_Mars im Forum .NET Archiv
    Antworten: 2
    Letzter Beitrag: 10.03.05, 13:12
  5. Das 'Nested Sets' Modell auslesen
    Von HSFighter im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 10.01.04, 14:20