Serialisierung und Deserialisierung von Objekten - Frageprogramm

Bitte aktiviere JavaScript!
Hallo,

ich versuche derzeit ein Programm zu erstellen, das einem ermöglicht, eigene Multiple-Choice-Fragen einzufügen und sich diese dann vom Programm abfragen zu lassen. (Also praktisch ein einfacher Vokabeltrainer)
Nun habe ich eine Klasse Frage mit den Parametern: frage, Antwortmoeglichkeit, Loesung, Relevanz, LetzterAufruf.
Die Paramter Relevanz und LetzterAufruf verändern sich, wenn ich mir eine Frage stellen lasse. Die Relevanz ist ein double wert, der halbiert wird, wenn ich die Frage richtig beantworte und verdoppelt, wenn ich die Frage falsch beantworte. Der Long Wert LetzterAufruf wird mit dem aktuellen Datum in Millisekunden besetzt. Mein Problem ist nun, dass ich die Werte einer Frage ja nicht persistent ändern kann. Deswegen hatte ich die Idee, die Fragen in eine Map zu packen und diese anschließend zu serialiseren, so dass ich auch nach einem erneuten Programmstart auf die aktuellsten Werte zugreifen kann und nicht die default werte erhalte, die ich beim Erstellen der frage in der Main-Methode festgelegt hatte.
Ich habe versucht, genau dies mit den Methoden writeToFile() und readFile() zu ermöglichen und soweit ich das sehe, schreibt er die Fragen auch in die Datei rein. Der Knackpunkt ist jetzt, dass das Programm die Datei beim Starten lesen soll, so dass wie erwähnt mit den neusten werten weitergearbeitet wird.
Vielleicht gibt es auch eine deutlich simplere Lösung, aber irgendwie muss ich die Werte der Fragen persistent updaten. Vielleicht hat hier ja noch jemand eine andere Idee. Mein Code zeigt die Main Methode, in der ich eine Frage erstelle und die Frage Klasse mit dem Konstruktor, der stellen() Methode, die mir die Fragen auf Wunsch stellt, die writeToFile, die readFile und schließlich die toString Methode.

Java:
public static void main(String[] args) {

        Frage frage1 = new Frage("Was ist die Lösung?",
                new String[] { "a", "b", "c", "d" }, 3, 1.0, 0);
               
    frage1.stellen();
}



public class Frage implements Serializable {

    private static final long serialVersionUID = 2618030797013447881L;

    public String frage;
    public String[] Antwortmoeglichkeit;
    public int Loesung;
    public double Relevanz;
    public long LetzterAufruf;
    public static int primarykey;
    static Map<Integer, Frage> Database = new TreeMap<Integer, Frage>();

    public Frage(String fra, String[] ant, int loe, double rel, long let) {
        this.frage = fra;
        this.Antwortmoeglichkeit = ant;
        this.Loesung = loe;
        this.Relevanz = rel;
        this.LetzterAufruf = let;
        Database.put(++primarykey, this);
        try {
            writeToFile(Database);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    public void stellen() {
        int i = 0;
        System.out.println(Database.get(i));
        System.out.println("0: " + Database.get(i).Antwortmoeglichkeit[0] + "\n" + "1: "
                + Database.get(i).Antwortmoeglichkeit[1] + "\n" + "2: " + Database.get(i).Antwortmoeglichkeit[2] + "\n"
                + "3: " + Database.get(i).Antwortmoeglichkeit[3] + "\n");
        Scanner in = new Scanner(System.in);
        int answer = in.nextInt();
        Frage frage = Database.get(i);
        int loe = frage.Loesung;
        frage.LetzterAufruf = System.currentTimeMillis();

        if (answer == loe) {
            frage.Relevanz = frage.Relevanz / 2;
            System.out.println("<Your answer is correct!>" + "\n");

        } else if (answer != loe) {
            frage.Relevanz = frage.Relevanz * 2;
            System.out.println("<Your answer is false!>" + "\n");
        }

    }

    public static void writeToFile(Map<Integer, Frage> f) throws FileNotFoundException, IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Fragen.bin"));

        oos.writeObject(f);
        oos.close();
        System.out.println("Done writing");
    }

    public static void readFile() throws FileNotFoundException, IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Fragen.bin"));
        Map<Integer, Frage> updated = (Map<Integer, Frage>) ois.readObject();
        ois.close();
        System.out.println("Done reading");
     
       

    }

    public String toString() {
        if (this.LetzterAufruf == 0) {
            return "Frage: " + this.frage + "\n" + "Antwortmöglichkeiten: " + "\n" + "0: " + this.Antwortmoeglichkeit[0]
                    + "\n" + "1: " + this.Antwortmoeglichkeit[1] + "\n" + "2: " + this.Antwortmoeglichkeit[2] + "\n"
                    + "3: " + this.Antwortmoeglichkeit[3] + "\n" + "Lösung: " + this.Loesung + "\n" + "Relevanz: "
                    + this.Relevanz + "\n" + "Letzter Aufruf: " + "nie";

        }

        return "Frage: " + this.frage + "\n" + "Antwortmöglichkeiten: " + "\n" + "0: " + this.Antwortmoeglichkeit[0]
                + "\n" + "1: " + this.Antwortmoeglichkeit[1] + "\n" + "2: " + this.Antwortmoeglichkeit[2] + "\n" + "3: "
                + this.Antwortmoeglichkeit[3] + "\n" + "Lösung: " + this.Loesung + "\n" + "Relevanz: " + this.Relevanz
                + "\n" + "Letzter Aufruf: " + new Date(this.LetzterAufruf);

    }

}
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Vorab ein Hinweis: in Java schreibt man per Konvention die Bezeichner von Variablen, Parametern und Methoden in lowerCamelCase, Namen von Klassen und anderen Typen in UpperCamelCase.

Grundsätzlich ist Dein Denkansatz nicht so verkehrt. Du solltest lediglich die verschiedenen Zuständigkeiten aus Deiner Fragen-Klasse heraustrennen. Aktuell ist die Klasse für alles zuständig.
 
Das writeToFile und readFile raus aus der Klasse Frage, da das nicht zu der Aufgabe der Klasse gehört (wie mihe7 schon gesagt hat).

In der Main würde ich dann überprüfen, ob denn eine Datei mit dem Namen Fragen.bin existiert, falls ja dann eben die Methode readFile aufrufen (die dann als Rückgabewert eben eine Map<Integer, Frage> hat) und diese dann in deiner Main speichern.
Anschließend kannst du dann deine Map durchgehen und entsprechend bei jeder Frage die stellen()-Methode aufrufen.

Denke das ist das, was du meinst.
 
Vorab ein Hinweis: in Java schreibt man per Konvention die Bezeichner von Variablen, Parametern und Methoden in lowerCamelCase, Namen von Klassen und anderen Typen in UpperCamelCase.

Grundsätzlich ist Dein Denkansatz nicht so verkehrt. Du solltest lediglich die verschiedenen Zuständigkeiten aus Deiner Fragen-Klasse heraustrennen. Aktuell ist die Klasse für alles zuständig.
Danke
 
Das writeToFile und readFile raus aus der Klasse Frage, da das nicht zu der Aufgabe der Klasse gehört (wie mihe7 schon gesagt hat).

In der Main würde ich dann überprüfen, ob denn eine Datei mit dem Namen Fragen.bin existiert, falls ja dann eben die Methode readFile aufrufen (die dann als Rückgabewert eben eine Map<Integer, Frage> hat) und diese dann in deiner Main speichern.
Anschließend kannst du dann deine Map durchgehen und entsprechend bei jeder Frage die stellen()-Methode aufrufen.

Denke das ist das, was du meinst.
Danke
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben