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! :mad: Die automatisch Speichern Funktion klappt nicht!
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
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.
 

Messoras

Aktives Mitglied
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.
 

Harry Kane

Top Contributor
Die Variable i in der for Schleife ist der index des File arrays dateien.
Ja danke, aber das hatte ich auch schon bemerkt.:rolleyes:
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.
 

Messoras

Aktives Mitglied
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:

Harry Kane

Top Contributor
...
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?
 

Messoras

Aktives Mitglied
Jap. Wird alles richtig ausgelesen, den einen Speicherstand, der 6 mal angezeigt wird kann ich einwandfrei laden.
 
Zuletzt bearbeitet:

X5-599

Top Contributor
Wird denn bei einem System.out.println(name0) jeweils die erwartete Bezeichnung beim Einlesen ausgegeben? Wenn nicht, liegt der Fehler wahrscheinlich dort.
 

Harry Kane

Top Contributor
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.
 

Messoras

Aktives Mitglied
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...
 

Messoras

Aktives Mitglied
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:

Harry Kane

Top Contributor
In der Tat sehr merkwürdig.
Kann es sein, daß die Variable deiner Speicherstand-Klasse, die du mit name0 setzt, als statisch deklariert ist?
 

Messoras

Aktives Mitglied
Stimmt! Das könnte sein! Warum wirft der denn keinen Error aus, wenn ich versuche ne Statische Variable zu setzen??
 
Zuletzt bearbeitet:

Messoras

Aktives Mitglied
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!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
U javax.mail.Folder.list() zeigt nicht alle Ordner Allgemeine Java-Themen 5
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
Rakshan Reading through list of objects Allgemeine Java-Themen 8
L Unterschied zwischen List und LinkedList implementierung? Allgemeine Java-Themen 15
Monokuma String List nach Zahlen und Worten sortieren Allgemeine Java-Themen 9
W Enumeration ein Array/List als Eigenschaft mitgeben - warum geht das nicht? Allgemeine Java-Themen 0
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
W Collections Suche etwas Sorted-List-Artiges...hat jemand eine Idee? Allgemeine Java-Themen 13
M List -Tableview-Javafx-Vererbung Allgemeine Java-Themen 35
R convert 2d array list to 2d array Allgemeine Java-Themen 1
B List<Integer> ist List<Double> ? Allgemeine Java-Themen 6
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
G Neues Objekt aus List<JsonObject> mit Stream Allgemeine Java-Themen 4
J Array-List Bubble-Sort Allgemeine Java-Themen 12
Hacer List<? super E> Allgemeine Java-Themen 10
C Objekte in Array List speichern? Allgemeine Java-Themen 1
P List<Type> Konvertieren in List<List<Type>> Allgemeine Java-Themen 3
P Sorted List o.ä. Allgemeine Java-Themen 2
M Erste Schritte List<> unbekannt?? Allgemeine Java-Themen 8
M List casting error Allgemeine Java-Themen 3
K Collections Collection<> mit List<String> abgleichen? Allgemeine Java-Themen 10
A List<String> auf doppelte Einträge überprüfen Allgemeine Java-Themen 4
U EJB Entity mit List Problem Allgemeine Java-Themen 2
? Objects aus List aussortieren Allgemeine Java-Themen 9
B List Pointer zurücksetzen Allgemeine Java-Themen 10
J Elemente zu einer List hinzufügen? Allgemeine Java-Themen 9
T Liste mit GregorianCalendar-Objekten in List einlesen, mit Collection sortieren und ausgeben Allgemeine Java-Themen 3
N List auf null prüfen Allgemeine Java-Themen 2
G List<Person> sortieren Allgemeine Java-Themen 6
A Probleme mit ConcurrentHashMap und List Allgemeine Java-Themen 3
C Komisches Verhalten zwischen Set und List bei contains Allgemeine Java-Themen 6
N Inverted index / inverted list Allgemeine Java-Themen 2
X Eine Map mit X -> List<Y>? Allgemeine Java-Themen 8
Shoox HashMaps in List? Allgemeine Java-Themen 3
B Frage zu Interface und List Allgemeine Java-Themen 4
H List wird nicht richtig gefüllt Allgemeine Java-Themen 6
Z aus private List<???> list eintrag löschen Allgemeine Java-Themen 4
L List <Hauser> in Combobox einfügen Allgemeine Java-Themen 5
isowiz java.util.List: Sortierung nicht nach bestimmten Attribut? Allgemeine Java-Themen 4
K von List getSelected auf ResultSet Datenbank löschen Allgemeine Java-Themen 2
E Speicher frei machen (List) Allgemeine Java-Themen 9
K List in Teillisten zerlegen Allgemeine Java-Themen 2
B Probleme mit awt.List in Chatprogramm Allgemeine Java-Themen 14
MQue List<String> aus List<Object> generieren Allgemeine Java-Themen 2
B List = ArrayList ? Allgemeine Java-Themen 12
N List<? implements "Interface"> geht nicht Allgemeine Java-Themen 13
G Byte- List mit einem Iterator durchlaufen Allgemeine Java-Themen 5
G Linked List zwischen zwei Threds übergeben Allgemeine Java-Themen 11
S List<Double> oder Double[] in double[] zu konvertieren Allgemeine Java-Themen 6
G Methode akzeptiert List<ParentClass> aber nicht List&l Allgemeine Java-Themen 2
G List- Einträge löschen Allgemeine Java-Themen 3
G java.util.List klonen Allgemeine Java-Themen 17
S Collections.binarySearch(list,"a") Allgemeine Java-Themen 7
K Bound mismatch: The generic method sort(List<T>) of ty Allgemeine Java-Themen 4
K "Too many open files" bei Property List Allgemeine Java-Themen 5
P List in Hashmap schreiben Allgemeine Java-Themen 5
J linked list per reverse() "umdrehen" Allgemeine Java-Themen 11
P java.util.List - Typ überschreiben Allgemeine Java-Themen 9
G Arraylist statt List - Sehr schlimm? Allgemeine Java-Themen 8
G List mit selbstdefinierten Objekten sortieren Allgemeine Java-Themen 2
M Datenstrukrue, List<Map<Integer, Map<String, . Allgemeine Java-Themen 2
F List<String> zu byte[] Allgemeine Java-Themen 7
G Map oder List mit festgelegter Reihenfolge Allgemeine Java-Themen 4
M Pendant zu list() und array() aus PHP in Java gegeben? Allgemeine Java-Themen 5
J Problem mit List Allgemeine Java-Themen 2
byte Generic Type einer List zur Laufzeit rausfinden? Allgemeine Java-Themen 4
S Generics List Allgemeine Java-Themen 3
G Inhalt einer Textdatei in eine AWT List schreiben Allgemeine Java-Themen 3
C access control list in java Allgemeine Java-Themen 7
T List.isEmpty() klappt nicht?!?!? Allgemeine Java-Themen 5
Queenman Interface Mein Microsoft Visual Studio Code zeigt komische Dinge & Menüs an Allgemeine Java-Themen 9
P Selenium Scriipt zeigt Fehler beim Import Allgemeine Java-Themen 3
Y paintComponent zeigt nix an Allgemeine Java-Themen 3
kodela JDialog zeigt Text nicht an Allgemeine Java-Themen 5
X Swing JTable zeigt nichts Allgemeine Java-Themen 4
D Java zeigt Buttons nicht korrekt an Allgemeine Java-Themen 0
T Stacktrace zeigt ...(Unknown Source) Allgemeine Java-Themen 10
F JFrame zeigt Hintergrund und nicht den Inhalt Allgemeine Java-Themen 12
lumo Row Header ist public, zeigt die funktion aber nicht public Allgemeine Java-Themen 8
N Array Element vom Typ eines Objekts zeigt auf ein anderes A. Allgemeine Java-Themen 4
S Eclipse zeigt build.xml immer als fehlerhaft Allgemeine Java-Themen 12
S findbugs zeigt unter Eclipse 3.2 nichts an Allgemeine Java-Themen 2
C Java zeigt keine Fensterinhalte Allgemeine Java-Themen 3
bueseb84 Wget mit Wildcards - oder wie lädt man bei JFrog die letzte Version eines Artifacts herunter Allgemeine Java-Themen 3
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
G Datum letzte 7 tage Allgemeine Java-Themen 6
M benötigte Excelformeln in die letzte Spalte Allgemeine Java-Themen 9
S Letzte txt.Datei nicht geschrieben Allgemeine Java-Themen 4
1 InputStream liest die letzte Zeile nicht ein Allgemeine Java-Themen 2
A Queue, beim dem das letzte Element herausfällt Allgemeine Java-Themen 4
Saxony Letzte Zeile eines Streames mit auslesen Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben