List zeigt nur das letzte Element an

Messoras

Aktives Mitglied
Hallo,
Ich programmiere gerade ein kleines Spiel und bin dabei eine vernünftige Speicherfunktion zu machen.
Jetzt kann ich zwar schon Level in eine Datei speichern und auch wieder laden, allerdings habe ich beim Laden das Problem, dass ich nur wiederholt den letzten Speicherstand angezeigt bekomme...

Ich benutze für die Speicherstände eine List, die ich mit dem datenarray initialisiere:

Die Speichern Methode:
Java:
knoepfe.toFirst();
            while (knoepfe.hasAccess()) {
                Flaeche co = (Flaeche) knoepfe.getObject();
                if (co.callback.equals("speichernan")) {
                    if (co.name.startsWith(speichertext)) {
                        co.name = speichertext;

                        speichern = false;
                        if (speichertext.length()>0) {
                            if (anzeige.equals("spiel")) {
                                Speicherstand speicherstand0 = new Speicherstand(speichertext,aktuell,bots,aktuell.spawnX,aktuell.spawnY);
                                //speicherstaende.append(speicherstand0);
                                Knopfcallback("speichernstopp");
                                text = "Karte "+speichertext+" gespeichert.";
                                textzeit = 100;
                                try {
                                    File f = new File(path+speichertext+".msav");
                                    BufferedWriter b = new BufferedWriter(new FileWriter(f,true));
                                    PrintWriter printWriter = new PrintWriter(b,true);
                                    //System.out.println("Filewriter '"+path+speichertext+".msav' erstellt.");

                                    printWriter.println(speicherstand0.toString());
                                    //printWriter.println(s);

                                    printWriter.flush();
                                    printWriter.close();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                    System.out.println("Fehler beim Speichern in Datei.");
                                }
                                speichertext = "";
                            }
                            else if (anzeige.equals("editor")) {
                                Speicherstand speicherstand0 = new Speicherstand(speichertext,edited,edibots,edited.spawnX,edited.spawnY);
                                //speicherstaende.append(speicherstand0);
                                Knopfcallback("speichernstopp");
                                text = "Karte "+speichertext+" gespeichert.";
                                textzeit = 100;
                                try {
                                    File f = new File(path+speichertext+".msav");
                                    BufferedWriter b = new BufferedWriter(new FileWriter(f,true));
                                    PrintWriter printWriter = new PrintWriter(b,true);
                                    //System.out.println("Filewriter '"+path+speichertext+".msav' erstellt.");
                                    speicherstaende.toFirst();
                                    while(speicherstaende.hasAccess()) {
                                        Object o = (Speicherstand)speicherstaende.getObject();
                                        if (((Speicherstand)o).name.equals(speichertext)) {
                                            printWriter.println(((Speicherstand)o).toString());
                                            //printWriter.println((Speicherstand)o);
                                        }
                                        speicherstaende.next();
                                    }
                                    printWriter.flush();
                                    printWriter.close();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                    System.out.println("Fehler beim Speichern in Datei.");
                                }
                                speichertext = "";
                            }
                        }
                        else {
                            text = "Ungültiger Name.";
                            textzeit = 100;
                        }
                    }
                }
                knoepfe.next();
            }

Die Methode, die die Speicherstände auflstet und Knöpfe daraus macht:
Java:
laden = true;
            machknopf("Zurück",getWidth()/2-30,140,60,20,"ladenstopp");
            int zaehler = 0;
            //Provisorisch
            //             speicherstaende.toFirst();
            //             while (speicherstaende.hasAccess()) {
            //                 Speicherstand bla = (Speicherstand) speicherstaende.getObject();
            //                 machknopf(bla.name,getWidth()/2-90,175+zaehler,180,20,"laden/"+bla.name);
            //                 zaehler += 35;
            //                 speicherstaende.next();
            //             }

            //Laden aus Datei
            File path = new File("main/saves");
            File[] dateien = path.listFiles();
            //Hier werden die Speicherstände auf 0 gesetzt!
            speicherstaende = new List();

            for (int i = 0; i < dateien.length; i++) {
                try {

                    FileReader fr = new FileReader(dateien[i]);
                    BufferedReader br = new BufferedReader(fr);
                    String info = br.readLine();

                    //Konstruktor:String n, Spielfeld m, List k,int x1, int y1
                    //toString: name+"#"+x+"#"+y+"#"+map.toString()+"#"+kis
                    //...
                    //Hier werden die Variablen initialisiert
                    //...
                    Speicherstand sps = new Speicherstand(name0,new Spielfeld(spfname0,sizeX0,sizeY0,gbt0),k0,x0,y0);
                    speicherstaende.append(sps);
                }

                catch(Exception e) {
                    System.out.println("Fehler beim Lesen der Speicherstände");
                }
            }
            speicherstaende.toFirst();
            while (speicherstaende.hasAccess()) {
                Speicherstand cs = (Speicherstand) speicherstaende.getObject();
                machknopf(cs.name,getWidth()/2-90,175+zaehler,180,20,"laden/"+cs.name);
                zaehler += 35;
                speicherstaende.next();
            }

Dann sollte eigentlich eine Reihe von Knöpfen rauskommen, die so aussieht:
-Level 1
-Level 2
-Level 3
-Level 4
-Level 5
-Level 6

Was aber rauskommt ist das:
Laden.jpg

Die Dateien im Ordner sind richtig und zeigen alle den korrekten Namen an.
Das Problem muss also irgendwo beim Laden der Speicherstände liegen.

#EDIT:
Den ganzen Post das dritte mal geschrieben! 😡 Die automatisch Speichern Funktion klappt nicht!
 
Zuletzt bearbeitet:
1. Rücke deinen Code mal gescheit ein. Ab der zweiten bis zur letzten Zeile könnten die beiden Codefragmente 12 Zeichen weiter rechts stehen.
2. Dein Fragmente sind keine kompletten Klassen, noch nicht mal komplette Methoden. Sie enthalten einen Haufen Variablen, die irgendwo her kommen. Sogar die Klassen die du verwendetst, kann man größtenteils nur erraten. Bei der Deklaration von speicherstaende = new List() geht es offenbar weder um java.util.List noch um java.awt.List. Wie soll man da rausfinden, was passiert?
3. Beim Einlesen der Daten in deiner for-schleife sehe ich nicht, wie du irgendeine von i abhängige Variable verwendest. Alle Speicherstand Objekte sehen so aus, als würden sie aus dem gleichen Variablensatz erzeugt werden.
 
Ich benutze die Liste aus den Abiturvorgaben, um Komplikationen zu vermeiden. Der Aufruf new List() weist speicherstaende eine neue leere Liste zu, die mit append() wieder aufgefüllt wird.
Die Variable i in der for Schleife ist der index des File arrays dateien.
 
Die Variable i in der for Schleife ist der index des File arrays dateien.
Ja danke, aber das hatte ich auch schon bemerkt.🙄
Dann nochmal deutlicher: du verwendest folgenden Konstruktor für Speicherstand:
Java:
    Speicherstand sps = new Speicherstand(name0,new Spielfeld(spfname0,sizeX0,sizeY0,gbt0),k0,x0,y0);
Die Variablen name0, spfname, sizeX0, sizeY0, gbt0, k0, x0, y0 verändern sich in der for-Schleife nicht. Falls du da nicht irgendein wichtiges Codefragment rausgelöscht hast, bedeutet das, dass alle Speicherstand-Instanzen mit denselben Variablen initialisiert werden.
Die info-Variable, die in deiner for-Schleife verändert wird, spielt bei der Konstruktion der Speicherstand-Objekte keine Rolle.
 
Die Variablen werden aus der Datei, die mit der toString Methode von Speicherstand geschrieben wurde, herausgelesen...
Den Teil habe ich rausgenommen, weil er sehr unübersichtlich und teilweise unkomplett ist. Allerdings werden dort alle Variablen, die ich zum Erstellen des Speicherstands verwende, deklariert.

D.h: im Original-Code werden die Variablen an der Stelle, wo ... steht definiert.
 
Zuletzt bearbeitet:
...
Den Teil habe ich rausgenommen, weil er sehr unübersichtlich und teilweise unkomplett ist. Allerdings werden dort alle Variablen, die ich zum Erstellen des Speicherstands verwende, deklariert.

D.h: im Original-Code werden die Variablen an der Stelle, wo ... steht definiert.
Bist du sicher, daß sie auch korrekt ausgelesen werden, trotz des "sehr unübersichtlichen und teilweise unkompletten" Codes?
 
Jap. Wird alles richtig ausgelesen, den einen Speicherstand, der 6 mal angezeigt wird kann ich einwandfrei laden.
 
Zuletzt bearbeitet:
Wird denn bei einem System.out.println(name0) jeweils die erwartete Bezeichnung beim Einlesen ausgegeben? Wenn nicht, liegt der Fehler wahrscheinlich dort.
 
Jap. Wird alles richtig ausgelesen, den einen Speicherstand, der 6 mal angezeigt wird kann ich einwandfrei laden.
Das meinte ich nicht. Ich sprach immer noch über dein eigentliches Problem.
Du hast 6 Dateien mit offensichtlich korrektem Inhalt. Nur beim Lesen von Daten aus diesen Dateien und bei der Konstruktion von Speicherstand-Objekten aus den Daten gibt es einen Fehler mit dem Ergebnis, daß offensichtlich 6 Speicherstand-Objekte mit gleichem Namen angelegt werden.
Den Teil des Codes, der für das auslesen der Daten veranwortlich ist, bezeichnest du selber als "sehr unübersichtlich und teilweise unkomplett" und hast ihn auch nicht gepostet. Angesichts des von dir geschilderten Verhaltens gehe ich aber davon aus, daß gerade dadrin der Fehler liegt.
Um den Fehler irgendwie einzugrenzen, würde ich dringend dazu raten, den Einlesefortschritt mit System.out.println() nachzuverfolgen. ZUmindest die Parameter, aus denen das Speicherstand-Objekt gebaut wird, solltest du auf der Konsole ausgeben.
 
Wenn ich den geladenen Speicherstand per System.out.println(sps.toString()) ausgebe erhalte ich wieder den korrekten Text für jeden Speicherstand, der dann nur leicht verändert ist, weil ich die Bots noch nicht übernommen habe (das ist mit unvolständig gemeint).
Der Fehler liegt also nicht beim Einlesen des Speicherstandes...
 
Ich verstehe es nicht... Die Variablen haben irgendwie alle 2 Werte... Ich habe die for-Schleife jetzt mal so gemacht:
Java:
for (int i = 0; i < dateien.length; i++) {
                try {

                    FileReader fr = new FileReader(dateien[i]);
                    BufferedReader br = new BufferedReader(fr);
                    String info = br.readLine();

                    //Konstruktor:String n, Spielfeld m, List k,int x1, int y1
                    //toString: name+"#"+x+"#"+y+"#"+map.toString()+"#"+kis
                    //toString Zeug
                    String name0 = info.substring(0,info.indexOf("#"));
                    //                     String info2 = info.substring(info.indexOf("#")+1,info.length());
                    //                     int x0 = Integer.parseInt(info2.substring(info2.indexOf("#")-1));
                    //                     String info3 = info.substring(info2.indexOf("#")+1,info2.length());
                    //                     int y0 = Integer.parseInt(info3.substring(info3.indexOf("#")-1));
                    //                     List k0 = new List();
                    int x0 = 0;
                    int y0 = 0;
                    List k0 = new List();
                    //System.out.println(name0);
                    //Speicherstand sps = new Speicherstand(name0,new Spielfeld("1",10,10,0),k0,x0,y0);
                    speicherstaende.append(new Speicherstand(""+name0,new Spielfeld("1",10,10,0),k0,x0,y0));
                    machknopf(""+name0,getWidth()/2-90,175+zaehler,180,20,"laden/"+name0);
                    zaehler += 35;
                }

                catch(Exception e) {
                    System.out.println("Fehler beim Lesen der Speicherstände");
                }
            }
Die Knöpfe sind dann zwar richtig, aber die Liste besteht immernoch nur aus "Level6"s...
Wie kann das denn sein?
Die werden doch beide über den String name0 definiert!
Ich habe die anderen Variablen jetzt auch alle mal garnicht großartig individualisiert, sondern bei jedem Speicherstand einfach eine kleine Zufallsmap drangehängt, aber irgendwie macht es das auch nicht übersichtlicher.
 
Zuletzt bearbeitet:
Stimmt! Das könnte sein! Warum wirft der denn keinen Error aus, wenn ich versuche ne Statische Variable zu setzen??
 
Zuletzt bearbeitet:
Jawoll! Das war's! Ich hatte das Problem, dass der Speicherstand die Statischen Variablen vererbt bekommt, damit die Ursprungsklasse sich nicht ändert. Das habe ich jetzt behoben und es klappt.
Dankeschön für die Hilfe!
 

Neue Themen


Zurück
Oben