ArrayList aus eigener Klasse "überschreibt" Werte nicht

Pagaty

Mitglied
Hallo,
ich versuche aus einer XML Datei Daten auszulesen und in eine Arraylist zu packen, um sie dann zu sortieren.

Ich habe jetzt eine eigene Klasse erstellt, in der ich die Datentypen aus dem XML definiere.
edit: aus dem xml kommen nur Strings. Ich definiere hier die ArrayList. (denke ich) 😉
Java:
class Race {
	Integer ID;
	String Datum;
    String Fahrer1;
    Integer f1b1runden;
    Double f1b1zeit;
 
    public Race(Integer ID, String Datum, String Fahrer1, Integer f1b1runden, Double f1b1zeit) {
        this.ID = 0;
        this.Datum = Datum;
        this.Fahrer1 = Fahrer1;
        this.f1b1runden = 0;
        this.f1b1zeit = 0.0;
    }
    @Override
    public String toString() {
        return ID+"\t"+Datum+"\t"+Fahrer1+"\t"+f1b1runden+"\t"+f1b1zeit;
    }
}
Ich muss zugeben, das ich diese Definition aus dem Netz habe, und sie nach meinen Wünschen geändert habe.

Wenn ich jetzt eine ArrayList<Race> erstelle und meine werte mit add einlesen möchte, dann werden nur die Strings in die Liste übernommen. Die Zahlenwerte nicht.
Java:
        ArrayList<Race> list = new ArrayList<Race>();
        Iterator itr = datei.getRootElement().getChildren("Zeitstempel").iterator();
        
        for (int zeile=0; zeile<meinInteger; zeile++){
        	if (itr.hasNext()) {
                Element elem = (Element) itr.next();
                System.out.println(elem.getText());
                System.out.println(elem.getAttributeValue("ID"));
                System.out.println(elem.getAttributeValue("F1"));
                System.out.println(Integer.parseInt(elem.getAttributeValue("f1_b1_runden")));
                System.out.println(Double.parseDouble(elem.getAttributeValue("f1_b1_zeit")));
                list.add( new Race (Integer.parseInt(elem.getAttributeValue("ID")),elem.getTextTrim(),elem.getAttributeValue("F1"),Integer.parseInt(elem.getAttributeValue("f1_b1_runden")),Double.parseDouble(elem.getAttributeValue("f1_b1_zeit"))));
                //System.out.println("pass");
        		}
        	}
        for (Object o : list) {
        	System.out.println(o);
        }

hier die Ausgabe
Code:
6
Chris
18
8.987
0	14.12.2012	Paul	0	0.0
0	14.12.2012	Peter	0	0.0
0	14.12.2012	JK	0	0.0
0	14.12.2012	Paul	0	0.0
0	19.12.2012	Michi	0	0.0
0	20.12.2012	Chris	0	0.0

in der 1. Spalte sollte eingendlich die ID liegen. Wenn ich direkt einlese (über dem list.add) werden die Werte ausgegeben. Genauso in der 4. und 5. Spalte.

Ich denke das ich beim casten den Fehler suchen muss, finde ihn aber nicht.

Über ne Gedankenstütze bin ich dankbar.

LG
Pagaty
 
Der Fehler steckt im Konstruktor:
Java:
public Race(Integer ID, String Datum, String Fahrer1, Integer f1b1runden, Double f1b1zeit) {
    this.ID = 0; //<-- Hier soll doch wohl eher der Parameter "ID" zugewiesen werden
    this.Datum = Datum;
    this.Fahrer1 = Fahrer1;
    this.f1b1runden = 0;//<-- Hier soll doch wohl eher der Parameter "f1b1runden" zugewiesen werden
    this.f1b1zeit = 0.0;//<-- Hier soll doch wohl eher der Parameter "f1b1zeit" zugewiesen werden
}
Du musst den Instanzvariablen die Werte der Parameter zuweisen und nicht konstant 0 oder 0.0
 
Und noch als Verbesserungsvorschlag:
Java:
// Besser das Interface als typ
List<Race> list = new ArrayList<Race>();
// Nutze konsequent Generics...
List<Element> zeitstempelElems = datei.getRootElement().getChildren("Zeitstempel");
// For-Schleife mit Index ist nicht nötig.
// Durch Nutzung von Generics entfällt hier das Casten auf Element
for(Element elem: zeitStempelElems) {
   System.out.println(elem.getText());
   System.out.println(elem.getAttributeValue("ID"));
   System.out.println(elem.getAttributeValue("F1"));
   System.out.println(Integer.parseInt(elem.getAttributeValue("f1_b1_runden")));
   System.out.println(Double.parseDouble(elem.getAttributeValue("f1_b1_zeit")));
   list.add( new Race (Integer.parseInt(elem.getAttributeValue("ID")),elem.getTextTrim(),elem.getAttributeValue("F1"),Integer.parseInt(elem.getAttributeValue("f1_b1_runden")),Double.parseDouble(elem.getAttributeValue("f1_b1_zeit"))));
                //System.out.println("pass");
}

for (Race o : list) {
  System.out.println(o);
}
 
Zuletzt bearbeitet von einem Moderator:
Mea culpa.

So stand es vorher da, und ich hatte casting Probleme. Als ich dann die absoluten Werte geschrieben habe, ging es.

Danach habe ich beim list.add das casting eingefügt und vergessen in der Klasse zu ändern.

Wenigstens hab ich es jetzt kapiert.

Sorry für die Zeit, die ich Dir gestohlen habe.

Aber trotzdem -> VIELEN DANK. Wer weis, wie lange ich noch gesucht hätte.

LG
Pagaty
 
Danke.
Der Iterator, stammt noch aus einer älteren "Version" meiner "Software".
War schon beim überlegen, ob ich ihn noch brauche.

Werde mich da einarbeiten.
Danke
Pagaty
 

Zurück
Oben