Vokabellernprogramm

mathiasj

Bekanntes Mitglied
Hey Leute,
ich habe eine Vokabellernprogramm geschrieben, und habe jetzt eine kleines Problem...
Und zwar hab ich eine Funktion hinzugefügt, die macht, das beim Erstellen von Vokabeln zwei Vokabeln erstellt werden, also eine "umgedreht" (Also wenn ich jetzt eine Vokabel "dominus/Hausherr" erstelle, wird auch eine Vokabel "Hausherr/dominus" erstellt). Das Problem ist aber, dass die zweite Vokabel immer direkt nach der ersten abgefragt wird, dann ist die Antwort natürlich noch im Kurzzeitgedächtnis! Hier ist mal der Qullcode von der Methode:

Java:
public class naechsteKarteSpeichernListener implements ActionListener {
    public void actionPerformed(ActionEvent ev) {
      if (andersrum.isSelected()) {
        QuizKarte karte1 = new QuizKarte(antwort.getText(), frage.getText()); //Hier wird die Karte erstellt, die "andersrum" ist
        kartenListe.add(karte1);
      } // end of if
      QuizKarte karte = new QuizKarte(frage.getText(), antwort.getText());//Hier die normale
      kartenListe.add(karte); //Kartenliste ist eine ArrayList
      frage.setText("");
      antwort.setText("");
      frage.requestFocus();
    }
  }

Hier noch die Speichermethode:

Java:
private void dateiSpeichern(File datei) {
    
    try {
      BufferedWriter writer = new BufferedWriter(new FileWriter(datei));
      
      for (QuizKarte karte:kartenListe) {
        writer.write(karte.getFrage() + "/");
        writer.write(karte.getAntwort() + "\n");
      }
      writer.close();
      
      
    } catch(IOException ex) {
      System.out.println("konnte die kartenliste nicht schreiben");
      ex.printStackTrace();
    }
    
  } // Methode schließen

So, vielen Dank schonmal!

LG,
mathaisj
 

codechaos

Mitglied
Wenn du in der Realität zwei Karten hintereinander erstellst, sind die im Kartenstapel natürlich auch hintereinander. Außer du mischst den Stapel bevor du dir die Karten ansiehst. (Collections.shuffle)
 

mathiasj

Bekanntes Mitglied
Das ich sie anders erstellen muss, ist mir schon kalr. Ich weiß nur nicht wie.

Und ich hatte noch keine Collections, könntest du ein Codebeispiel machen?
 

codechaos

Mitglied
Nein, du brauchst sie nicht anders erstellen, es reicht, wenn du sie nachträglich mischst. Wenn man Collections.shuffle() eine Liste übergibt, wird diese gemischt.

Java:
List<Card> cards = new ArrayList<Card>(); 
cards.add(new Card(1)); 
cards.add(new Card(2)); 
cards.add(new Card(3));
Collections.shuffle(cards);
System.out.println(cards.get(0));
 

mathiasj

Bekanntes Mitglied
Danke, das mit Collections.shuffle() funktioniert perfekt!

Und warum Frage und Antwortfeld vertauschen? Bietet das irgendwelche Vorteile? Mit Collections.shuffle() habe ich den Vorteil, dass ich in der .txt Datei die erstellt wird alles Vokabeln hintereinander habe...
 

codechaos

Mitglied
Stell dir vor, du hast eine Vokabel falsch erstellt oder willst eine Karte ändern, die beidseitig abgefragt wird. Es wäre einfacher nur eine Karte dem entsprechend zu ändern, als zwei. Es spart dem späteren Benutzer etwas Arbeit ;)
 

BRoll

Bekanntes Mitglied
Mit FileWriter und BufferedReader gehts meiner Meinung am einfachsten.

Einlesen und Schreiben über eine Text Datei sieht so aus:

Java:
String dateipfad="";
boolean schreibart=true;
	try {
			FileWriter out = new FileWriter(dateipfad,schreibart);
			out.write(s);
			out.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();			
		}
Denke mal Dateipfad ist logisch, schreibart bestimmt ob die Datei überschrieben oder
weitergeschrieben wird. Wenn schreibart auf true ist, dann wird die Datei nur weitergeschrieben,
und nicht neu geschrieben.

Und das Einlesen geht ganz einfach so:
Java:
try {

	 String inhalt="",zeile="";

					try {
                                                   BufferedReader br = new BufferedReader(new FileReader(pfad));
						while((zeile = br.readLine())!= null) {
							 inhalt += zeile;
						 }
                              
						
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

Das wars auch schon.

mfg BRoll
 

mathiasj

Bekanntes Mitglied
Ahh, danke :)
aber gibt es acuh eine Funktion zum überschreiben? Dass ich zum Beispiel die .txt Datei nach einem bestimmten Wort durchsuche und dieses Wort dann ändere?
 

BRoll

Bekanntes Mitglied
Ahh, danke :)
aber gibt es acuh eine Funktion zum überschreiben? Dass ich zum Beispiel die .txt Datei nach einem bestimmten Wort durchsuche und dieses Wort dann ändere?


Ja wenn du "schreibart" beim FileWriter auf false setzt, dann wird
der ganze Inhalt ersetzt.
Man kann nur an den Anfang oder an das Ende einer Datei was reinschreiben.
Bei deiner Problemstellung wäre es am besten, alles einzulesen,
Änderungen vornehmen intern im Programm, und danach alles
wieder speichern als String. Somit wird alles aktuallisiert und
dementsprechend auch geändert.

Mir ist nicht bekannt dass man mit Java an einer bestimmten Stelle
in einer Datei etwas ändern bzw. löschen/reinschreiben kann.

Bei so kleinen txt Dateien spielt das eh keine Rolle ;)
 
F

Firephoenix

Gast
Direktes Einfügen in der Mitte geht nicht, ein einfacher Weg Dateien zu ändern (auch größere) wäre z.B.

  1. temporäre Datei erstellen
  2. eigentliche Datei lesen
  3. stellen die nicht geändert werden müssen in temporäre Datei schreiben
  4. zu manipulierende Stellen geändert in temporäre Datei schreiben
  5. rest in temporäre Datei schreiben
  6. Streams schließen
  7. ursprüngliche Datei entfernen
  8. temporäre datei umbenennen zur ursprünglichen Datei

Gruß
 

BRoll

Bekanntes Mitglied
Direktes Einfügen in der Mitte geht nicht, ein einfacher Weg Dateien zu ändern (auch größere) wäre z.B.

  1. temporäre Datei erstellen
  2. eigentliche Datei lesen
  3. stellen die nicht geändert werden müssen in temporäre Datei schreiben
  4. zu manipulierende Stellen geändert in temporäre Datei schreiben
  5. rest in temporäre Datei schreiben
  6. Streams schließen
  7. ursprüngliche Datei entfernen
  8. temporäre datei umbenennen zur ursprünglichen Datei

Gruß

Achso ja so kann mans machen.

Wäre aber nur eine Auslagerung des eigentlichen Arbeitsvorgang.
Vom Zeitaufwand beim Schreiben/Lesen würde es sogar noch mehr
Zeit brauchen. Ich weiß nicht obs dann so sinnvoll wäre xD

Letztendlich hat man ja nichts damit gewonnen wenn ichs richtig versteh.
Außer das man eine neue Datei erstellt und damit die alte ersetzt.
Aber das kann man ja dann auch gleichsetzen mit Inhalt der alten
löschen und neuen Inhalt reinmachen. Bloß braucht man dazu
nicht eine neue temporäre Datei.

Für mich ist das so unterschiedlich wie
Java:
x++;    und   x=x+1;

Aber darfst mich gerne verbessern wenn ich da gerade unsinn erzähle :D
 
F

Firephoenix

Gast
@BRoll

Der Unterschied ist der verbrauchte Arbeitsspeicher, wenn ich die Datei Zeile für Zeile in eine andere Datei übertrage verdoppel ich kurzzeitig den Festplattenverbrauch und muss 1 Zeile + meine Änderungen im Ram halten.
Bei den aktuellen Fesplattengrößen ist es recht unwahrscheinlich, das die Datei gerade 50 Gig groß ist und die restlichen 50 freien Gig dadurch voll werden (Bei solchen Dateigrößen hätte man aber wohl eher andere Probleme...).
Lese ich die Datei komplett ein und schreibe sie dann neu muss ich die ganze Datei puffern, und da macht der Unterschied zwischen Festplatte und Speicher wieder zu schaffen - 2 GB Text sind auf der Platte machbar, in einer laufenden Java-Anwendung kann es einem den Memory um die Ohren hauen :)

Gruß
 

Neue Themen


Oben