Hallo.
Ich versuche, Eine Textdatei zeilenweise einzulesen und diese Zeilen nach verarbeitung in einer ArrayList zu speichern. Hier mal die entsprechenden Code-Blöcke:
privateIRWordprocessLine(String line){IRWord word =newIRWord(line.split("\t"));return word;}
Jedes Mal, wenn ich ein neues Element (IRWord) in der ArrayList (sentence) speichere, werden die alten Elemente überschrieben. Ich weiß, dass man jedes Mal eine Neue Instanz der Elemente erstellen muss, bevor man diese in einer Liste speichert, aber ich dachte, das hätte ich in der Methode getan.
Könnt ihr mir bitte helfen, dieses Problem zu lösen, ich stehe irgendwie auf dem Schlauch.
in welcher Weise zeigt sich 'überschrieben', was genau prüfst du?
ist die Anzahl der Elemente in der Liste ok?
alles dieselben Objekte können es anscheinend nicht sein,
aber wenn statische Variablen im Spiel sind, wirken vielleicht alle Objekte gleich?
Details und Infos, immer könnte es mehr sein,
idealerweise sowieso vollständige Testprogramme posten, auf Datei ist dabei vielleicht verzichten,
einfach nur
> sentence.add(processLine("a"));
> sentence.add(processLine("b"));
> sentence.add(processLine("c"));
müsste doch auch eine Aussage haben
Sollet das nicht helfen, lass die Zeilen so wie sie sind und debugge es mal:
Setze einen Breakpoint bei "sentence.add(irWord);"
Merke dir mal die Objekt-ID von "irWord".
Ist es immer die gleiche ID, dann ist es immer das gleiche Objekt, heißt, dein Array mag zwar mehrere Einträge haben, die verweißen aber alle auf das gleiche Objekt.
Eigentlich solltest du eine neue Instantz des "word" Objekts in der Methode "processLine" bekommen, da die Variable ja nur im Methoden-Fokus besteht.
Sonst, versuch mal, die Methode "processLine" zu verkürzen auf:
Die add-Methode einer Liste added wirklich. D.h. das Element wird an das Ende der Liste geschrieben. Der Liste ist es auch egal, ob evtl. schon so ein Element vorhanden ist (egal, ob gleich oder sogar identisch).
Die Frage ist jetzt, wie der Effekt, von dem Du denkst es sei "Überschreiben" wirklich zustande kommt. Anhand der vorhandenen Informationen kann man da nur raten. Weist Du der Variablen
Code:
sentence
evtl. mehrfach einen Wert zu? Überschreibst Du also evtl. die komplette Liste?
Auch Dein verschachteltes while-Schleifenkonstrukt scheint mir fehleranfällig. Trenne die Bedingung für das Lesen aus dem Reader (
Code:
line!=null
) von den Bedingungen, die fachlich die weitere Verarbeitung steuern (
Code:
line.matches("</header>"))/line.matches(""))
)
Und noch zwei Performance-Tipps:
Code:
!line.matches("</header>"))
Führt dazu, dass das Pattern, gegen das gematcht wird, jedes Mal neu kompiliert wird. Benutze besser
Die eckigen Klammern habe ich in das Script eingefügt, da dies nur ein Ausschnitt ist und im eigentlichen Programm steht an dieser Stelle nichts. Die Variable wird an anderer Stelle deklariert.
In der Liste speichere ich Instanzen von einer Klasse IRWord, in der ich Attribute speichere, die ich aus der eingelesenen Textdatei-Zeile herauslese.
Geprüft werden die Instanzen durch eine einfache FOR-Schleife, die wie folgt aussieht (erweitertes Script)
Sollet das nicht helfen, lass die Zeilen so wie sie sind und debugge es mal:
Setze einen Breakpoint bei "sentence.add(irWord);"
Merke dir mal die Objekt-ID von "irWord".
Ist es immer die gleiche ID, dann ist es immer das gleiche Objekt, heißt, dein Array mag zwar mehrere Einträge haben, die verweißen aber alle auf das gleiche Objekt.
Die add-Methode einer Liste added wirklich. D.h. das Element wird an das Ende der Liste geschrieben. Der Liste ist es auch egal, ob evtl. schon so ein Element vorhanden ist (egal, ob gleich oder sogar identisch).
Die Frage ist jetzt, wie der Effekt, von dem Du denkst es sei "Überschreiben" wirklich zustande kommt. Anhand der vorhandenen Informationen kann man da nur raten. Weist Du der Variablen
Code:
sentence
evtl. mehrfach einen Wert zu? Überschreibst Du also evtl. die komplette Liste?
Auch Dein verschachteltes while-Schleifenkonstrukt scheint mir fehleranfällig. Trenne die Bedingung für das Lesen aus dem Reader (
Code:
line!=null
) von den Bedingungen, die fachlich die weitere Verarbeitung steuern (
Code:
line.matches("</header>"))/line.matches(""))
)
Und noch zwei Performance-Tipps:
Code:
!line.matches("</header>"))
Führt dazu, dass das Pattern, gegen das gematcht wird, jedes Mal neu kompiliert wird. Benutze besser
du hast IRWord immer noch nicht gepostet,
es ist für die gesamte Welt und sogar Marsianer unklar, was getWord() liefert,
kann auch von einem Zufallsgenerator abhängen ohne Code..
du hast IRWord immer noch nicht gepostet,
es ist für die gesamte Welt und sogar Marsianer unklar, was getWord() liefert,
kann auch von einem Zufallsgenerator abhängen ohne Code..
Da alle Attribute statisch sind, wird dies immer überschrieben, wenn ein neues Objekt erzeugt wird. Der Sinn von static ist eben, dass es nur einmal existiert. Du speicherst so immer nur das neuste Objekt.
Du musst die Attribute eben nicht static machen.
Und noch was: Die zweifach verschachtelte while-Schleife mit mehrfachem read ist schon schwer durchschaubar. Jetzt kommt darin noch eine for-Schleife! Über Ausgaben in merkwürdiger Reihenfolge brauchst Du Dich da nicht zu wundern. Refactor das unbedingt. Überlege, ob Du wirklich alle Schleifen brauchst. Falls ja, lager sie in eigene Methoden mit geeigneten Übergabeparametern/Return-Values aus. Damit bist Du dann auch in der Lage, jede Methode einzeln zu testen und findest den Fehler schneller.
Da alle Attribute statisch sind, wird dies immer überschrieben, wenn ein neues Objekt erzeugt wird. Der Sinn von static ist eben, dass es nur einmal existiert. Du speicherst so immer nur das neuste Objekt.
Du musst die Attribute eben nicht static machen.
Und noch was: Die zweifach verschachtelte while-Schleife mit mehrfachem read ist schon schwer durchschaubar. Jetzt kommt darin noch eine for-Schleife! Über Ausgaben in merkwürdiger Reihenfolge brauchst Du Dich da nicht zu wundern. Refactor das unbedingt. Überlege, ob Du wirklich alle Schleifen brauchst. Falls ja, lager sie in eigene Methoden mit geeigneten Übergabeparametern/Return-Values aus. Damit bist Du dann auch in der Lage, jede Methode einzeln zu testen und findest den Fehler schneller.