Hi!
Ich habe ein kleines Problem da ich eine Datei auslesen möchte in der zum Beispiel folgendes steht:
1+1=|2
2+2=|4
3+3=|6
jetzt möchte ich per zufall auswählen welche zeile ausgelesen wird und dann das ganze weiterverwnden,
indem ich das splitte und in ein Textfeld den Teil vor dem | schreibe und in ein zweites wird dann vom
Benutzer die Lösung eingegeben und dann vom Programm überprüft ob die eingegebene Lösung mit dem
zweiten Teil der Zeile übereinstimmt. Allerdings darf jede Zeile nur ein Mal in „einem Durchgang“ auftauchen.
wenn alle zeilen abgearbeitet sind soll das ganze wieder von vorne beginnen, wenn man auf einen Button klickt!
Also das eingentliche Problem ist nur dass ich das mit dem Mischen und das, dass jede zeile nur ein Mal auftaucht nicht hinbekomme!!!
bau dir eine Klasse, in der Aufgabe und Lösung getrennte Felder sind. Erzeuge eine Liste in dr Du Objekte dieser Klasse ablegst, für jede Zeile der Datei eins. Der zufällige Zugriff auf elemente der Liste sollte dann nicht mehr schwer sein…
Schau dir mal Sets an. Damit wären dann schonmal alle Elemente unique. Und sind die Zeilen erst einmal alle eingelesen, z.B. wie Timothy_truckle es vorgeschlagen hat, ist ein Mischen und die Zufallswahl ein Klacks.
Ich verstehe nicht ganz!
Zum Verständniss schreibe ich dir mal meinen bisherigen code:
try {
in = new BufferedReader(new FileReader(eingeloggt + "_Datei.voc"));
String zeile = null;
while ((zeile = in.readLine()) != null) {
splittArray = zeile.split("\\|");
tfFrage.setText(splittArray[0].toString());
}
} catch (IOException e1) {
e1.printStackTrace();
}
btnUeberpruefen.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(tfAntwort.getText().equals(splittArray[1].toString())) JOptionPane.showMessageDialog(null, "Richtig");
else{
JOptionPane.showMessageDialog(null, "Falsch");
tfAntwort.setText("");
}
}
});```
Wenn ich jetzt den Teil mit dem BufferedReader in eine Methode packe und das dann vor und nach dem überprüfen aufrufe nimmt er immer die letzte zeile.
Und nur mal so ich bin noch der totale Anfänger, also könntest du mir das bitte ein bischen genauer erklären!
MFG
Lukas
*** Edit ***
Jetzt noch mal ne vielleicht blöde frage.
Ich habe jetzt eine HashSet erstellt, die ja bewirkt, dass
jeder eintrag nur einmal vorkommt jetzt weiß ich blos
immer noch nicht wie ich aus der HashSet zufällig einen Eintrag auswähle!
Hilfe!:heul:
[QUOTE=programmierer12]Und nur mal so ich bin noch der totale Anfänger, also könntest du mir das bitte ein bischen genauer erklären![/QUOTE]Dann habe ich zu Beginn 2 bittere Erkenntnisse für Dich:
[ol]
[li]Der Computer macht (auch mit Java) nur dass, was Du ihm sagst, nicht dass was Du willst.
[/li]In den Zeilen 6 bis 12 sagst Du ihm, dass er die gesamte Datei durcharbeiten soll und deren einzelne Zeilen nacheinander der selben Variablen zuweisen soll. (Das ist die Stelle, an der eine [JAPI]List[/JAPI] oder ein [JAPI]Set[/JAPI] in’s Spiel komen würde.)
[li]Java ist eine objektorientierte Sprache. Das bedeutet, dass es überdurchschnittlich oft sinnvoll ist eine Klasse zu erstellen und mit Objekten dieser zu arbeiten.
[/li]Es ist sicher möglich, mit dem Array, das String.split() liefert weiter zu arbeiten, aber dass ist nicht gerade leserlich. Da könntest Du auch Perl programmieren… ;o)
[/ol]
Jetzt noch mal ne vielleicht blöde frage.
Ich habe jetzt eine HashSet erstellt, die ja bewirkt, dass
Ich hab das jetzt mit einer HashSet gemacht nur weiß ich
nicht wie ich aus diesem zufällig einen Eintrag auswähle!
@ programmierer12
lies dir dein Posting nochmal durch, was soll das bedeuten?
wenn du dich nicht auf Fremdsprache Deutsch berufen willst, und selbst dann wäre es ein unsinniger Aufbau,
dann solltest du mehr Sorgfalt in die Beiträge stecken, das ist eine Beleidigung an alle Helfer
du kannst im Zweifel sichergehen und alle Elemente in eine Liste einfügen, dann per Random einen zufälligen Index wählen
(edit: oder das genannte shuffle und dann der erste/ nullte Index)
Tut mir leid dass ich bei meinem letzten Beitrag ein wenig schwachsinn geschrieben habe!!!
ich wollte schon mit Math.Random arbeiten doch wie kann ich denn dann einen Eintrag auswählen,
da die Liste kein array ist, oder liege ich damit falsch.
Nimm dir bitte die Zeit und lies die Beiträge sorgfältig durch.
Da geht es um Objekte, Listen und Collection.shuffle. Das kann man nicht in 10Minuten durchgehen.
HashSet erhält nicht Reihenfolge, in der die Elemente hinzugefügt wurden und bietet keinen wahlfreien Zugriff. Letzteres benötigt man aber für zufällige Auswahl. Glücklicher Weise läßt sich das Set als Parameter für den Konstruktor einer [JAPI]ArrayList[/JAPI] verwenden…
Zum Erzeugen von ZufallsZahlen gibt es die Klasse [JAPI]Random[/JAPI] und darin die Methode nextInt(int max). Netter Weise sagt einem eine [JAPI]List[/JAPI] wie groß sie ist, so dass man keine zu großen Zufallszahlen erzeugen muss.
Übrigens erreicht man am sichersten, dass ein Element kein zweites mal gezogen wird indem man es aus der Liste entfernt. Positiver Nebeneffekt: man weiss genau, wann alle Elemente dran waren, nämlich wenn die Liste leer ist…
Anderer seites ist Collections.suffle() und simples Iterieren wohl schneller implementiert…