BufferedReader: jede 2. Zeile in 2 Arrays

Hallo…
Ich bin seit längerer Zeit am Rumprobieren, ich hoffe dass mir vielleicht jemand helfen kann. Eigentlich ist die Aufgabe nicht so schwer, aber irgendwie haut es nicht hin.
Zur Aufgabenstellung:
Ich habe eine Textdatei mit 8 Zeilen. Diese beinhaltet englische und deutsche Wörter. Es soll sozusagen am Ende ein kleiner Vokabeltest werden. Die erste Zeile ist ein englisches Wort, die 2. Zeile die deutsche Übersetzung. Dann kommt wieder ein englisches Wort usw.
Also 4 englische und 4 deutsche Wörter. Diese möchte ich mit Hilfe eines BufferedReaders in 2 String Arrays schreiben. Eines für die englischen und das andere für die deutschen Wörter. Um letztendlich die Überprüfung usw etwas bequemer zu machen…
Ich arbeite in dieser Methode mit vielen Schleifen und verliere langsam den Überblick. Irgendwo habe ich einen Fehler. Vll. eine falsche Klammer, oder ein Logikfehler. Also ich hoffe mir kann da jemand weiterhelfen.
Danke im Voraus.
Code:

public void readVokabeln() {

 try {
// BufferedReader liest zeilenweise aus der Textdatei

BufferedReader datei = new BufferedReader(new FileReader(
 vokabeldatei));

// erste Zeile beginnen
 int en\_nr = 1;
// liest zeilenweise aus, solange dateiende = false

// 1%2 nicht null --\> 1.Zeile = en
 if (en\_nr % 2 != 0) {

 for (int i = 0; i deutsch
 en\_nr++;
 }
 } else {

 for (int j = 0; j deutsch
 en\_nr++;
 }
 }
 datei.close();

 } catch (IOException x) {
// Meldung, wenn Fehler auftritt
JOptionPane.showMessageDialog(null, "Kann Daten nicht laden!");
// Wenn Fehler auftritt, wird das Programm ordnungsgemäß beendet
 System.exit(0);

 }

 }

Du machts es Dir unnötig schwer. Lese mit einer while Schleife aus dem BufferedReader, so lange, bis das lesen fehlschlägt (nulll zurückgibt). Bei jedem Durchlauf duch die while Schleife setzt Du einen Wahheitswert auf sein Gegenteil (daran kannst Du sehen ob Du eine deutsche oder englische Zeile liest bzw. eine gerade oder ungerade Zeile. Das setzt natürlich voraus, daß die Zeilen IMMER abwechselnd befüllt sind, und IMMER mit der gleichen Sprache starten). Wegschreiben tust Du das ganze dann in ArrayLists oder Vektoren, die haben eine dynamische Größe und müssen nicht vorinizialisiert werden. Ich kann da gern ein Beispiel zu liefern, wenn das gerade nicht ganz klar ist, aber im Moment bin ich etwas in Eile.

Hallo und Danke erstmal :smile:
Hmm… leider kann ich Dir da nicht so ganz folgen.
Ich habe auch noch nicht soviel mit Java gemacht. Bin da eher noch Anfänger…
Also das mit der while-Schleife bis null zurückgegeben wird, hab ich ja kapiert. Aber wie das mit den Wahrheitswerten funktionieren soll, versteh ich net so recht.
Es wäre echt supi, wenn Du mir da ein Bsp. geben könntest.
Habe gedacht ich könnte es so lösen, wie ichs vorhatte… warum auch immer das jetzt nicht hinhaut.
Grüßl :smile:

Ich nehme im Folgenden an, die erste Zeile ist immer ein englisches Wort.

boolean english = true;
Vector eng = new Vector();
Vector ger = new Vector();
String line;
BufferedReader in = new BufferdReader(); #da mußt Du Deinen Stream 
 #rankleben 
while ((line = in.readLine()) != null) {
 if (english) {
 eng.add(line);
 englisch = false;
 } else {
 ger.add(line);
 english = true;
 }
}
1 Like

Hallöle…
Danke für deine Hilfe. Musste mich erst etwas einlesen, da ich bisher noch nie mit Vektoren gearbeitet habe. Ich habe jetzt 2 Methoden:

  1. Zum Einlesen aller Vokabeln und ausgeben von zufälliger englischer Vokabel und zugehöriger Lösung

    public void readVokabeln() {

    try {
    // BufferedReader liest zeilenweise aus der Textdatei
    BufferedReader datei = new BufferedReader(new FileReader(
    vokabeldatei));

    // erste Zeile beginnen

    while ((line = datei.readLine()) != null) {
    if (english) {
    eng.add(line);
    english = false;
    } else {
    ger.add(line);
    english = true;
    }
    }
    // Gibt alle englischen und deutschen Vokabeln nach der Reihenfolge
    // aus
    System.out.println("EN: " + eng);
    System.out.println("DE: " + ger);

    // Zufällige englische Vokabel
    nr = (int) (Math.random() * 4);
    Object engl = eng.get(nr);

    // Übersetzung der zufälligen englischen Vokabel
    Object deut = ger.get(nr);
    // Test: nr ausgeben
    System.out.println(nr);
    // Englische Vokabel und zugehörige deutsche Übersetzung ausgeben
    System.out.println(engl);
    System.out.println(deut);

    datei.close();

    } catch (IOException x) {
    // Meldung, wenn Fehler auftritt
    JOptionPane.showMessageDialog(null, „Kann Daten nicht laden!“);

    // Wenn Fehler auftritt, wird das Programm ordnungsgemäß beendet
    System.exit(0);

    }

    }

  2. Um neben der richtigen Lösung noch 2 weitere mögliche Lösungen auszugeben:

    public void moeglicheLoesungen() {

    // 2 Zufallszahlen generieren lassen, als mögliche deutsche Lösung

    for (int x = 1; x 3) {
    z–;
    Object deutsch = ger.get(z);
    System.out.println(deutsch);
    } else {
    Object deutsch = ger.get(z);
    System.out.println(deutsch);
    }

    }

    catch (Exception exp) {
    System.out.println(„Fehler beim Ausgeben der Lösungen!“);
    }

    }
    }

Klappt alles wunderbar.
Vielen Dank nochmal :smile:
Grüßl :wink:

Hmm…
eine Kleinigkeit ist allerdings doch noch offen:

try {
 // Zufallszahl erzeugen

 int z = (int) (Math.random() \* 4);
 // zufälliges Objekt ausgeben (von 0-3)
 //test:
// System.out.println(z);
 if (z == nr && z 3) {
 z--;
 Object deutsch = ger.get(z);
 System.out.println(deutsch);
 } else {
 Object deutsch = ger.get(z);
 System.out.println(deutsch);
 }
//test
//System.out.println(nr);

Manchmal bekomme ich 2 mal die gleiche mögliche Lösung.
Wie kann ich denn die if-Anweisung am Besten machen, sodass z nie nr ist und z beim zweiten durchlauf nicht wieder z ist?
Vll. mit z1 und z2? Oder gibt es auch eine einfachere Lösung.
Würd mich sehr über Ideen freuen.
Danke im Voraus.
Grüßl :wink:

Ich habs jetzt mit z1 und z2 gelöst. Ist vll. die einfachste Lösung?!

public void moeglicheLoesungen() {

 // 2 Zufallszahlen generieren lassen, als mögliche deutsche Lösung

 for (int x = 1; x 3) {
 z1--;
 Object deutsch = ger.get(z1);
 System.out.println(deutsch);
 } else {
 Object deutsch = ger.get(z1);
 System.out.println(deutsch);
 }


 if (z1 == z2) {
 z2 = (int) (Math.random() \* 4);

 }
 if (z2 == nr && z2 3) {
 z2--;
 Object deutsch = ger.get(z2);
 System.out.println(deutsch);
 } else {
 Object deutsch = ger.get(z2);
 System.out.println(deutsch);
 }

 // test
 // System.out.println(nr);

 }

 catch (Exception exp) {
 System.out.println("Fehler beim Ausgeben der Lösungen!");
 }

 }
 }

Grüßl :wink:

Ich bin nicht ganz sicher, ob ich das richtig verstehe. Du erzeugst eine Zufallszahl über die Länge des Vectors, weil Du einen zufälligen Eintrag herausgreifen willst. Dein Problem ist nun, daß Du dabei auch immer wieder Zeilen liest, die Du schoneinmal gezogen hast. Wenn ja, kannst Du alle gezogenen Zahlen in einen neuen int Vector (oder ArrayList oder Array) schreiben und die nächste gezogene damit vergleichen.