zufälliges Wort aus einer Datei einlesen

Diskutiere zufälliges Wort aus einer Datei einlesen im Java Basics - Anfänger-Themen Bereich.
O

Ollson70

Hallo,
ich habe folgendes problem mit dem u.a. Quellcode. Die Aufgabe ist es ein ein zufälliges Wort aus einer Datei einzulesen.
Habe schon alles mögliche versucht. Das einlesen klappt auch soweit. Leider lieste er immer nur das erste Wort der datei ein.Weiß nicht mehr weiter.
oder ist es gar der völlig falsche ansatz.

//die Methode ermittelt zufällig ein Wort
private void neuesWort() {
//Aufgabe2 das einlesen der Worte aus der datei woerter.dat
try (RandomAccessFile datei = new RandomAccessFile("woerter.dat","r")){


int zufall;
//String [] woerter = {"Test", "Automobil", "Versuch", "Hund", "Katze",
//"Ziege", "Maus", "Elefant", "Isopropylalkohol", "Schwimmbad"};
//woerter = datei.readUTF();



//ein zufälliges Wort ermitteln

zufall = (int)(datei.length()*Math.random());

// die schleife für die durchläufe
//while(datei.getFilePointer() < datei.length()) {
for(int i = 0; i< zufall; i++);

// und die Position für das Wort holen
long neuePosition= zufall;
//und das wort weitergeben
zufall = datei.readUnsignedShort();
//datei.seek(datei.getFilePointer() + neuePosition);
datei.skipBytes((int) (datei.getFilePointer() + zufall));
//String wort = datei.readUTF();



//das Suchwort und die Zeichen für die Anzeige setzen
suchwort = new String(datei.readUTF());
//suchwort = new String(datei.readUTF());
anzeige = new StringBuilder(suchwort);

//alle Zeichen in der Anzeige ersetzen durch *
for (int zeichen = 0; zeichen < suchwort.length(); zeichen++)
anzeige.setCharAt(zeichen, '*');

//die Sternchen anzeigen
ausgabeText.setText(anzeige.toString());

// }
}
catch(IOException e) {
Alert meinDialog = new Alert(AlertType.INFORMATION, "Beim Laden ist ein Problem aufgetreten");
meinDialog.setHeaderText("Bitte beachten");
meinDialog.showAndWait();
}
}
 
MoxxiManagarm

MoxxiManagarm

Das Problem bei deinem Ansatz ist, dass Wörter, welche länger sind, eine größere Chance haben gewählt zu werden. Ist das gewünscht? Eine andere Variante wäre es erst alle Wörter zu laden und dann zufällig eins auszuwählen. Das würde hingegen zu lasten des Arbeitsspeichers gehen und ist nur bei kleineren Dateien ratsam.

Ein Kompromiss wäre es die Datei 2mal zu lesen. Beim ersten Durchlauf zählst du die Wörter, dann wählst du einen zufälligen Index in diesem Rahmen und dann liest du die Datei wieder bis zu inklusive diesem Wort.
 
H

httpdigest

Irgendwie ergibt doch der ganze Code überhaupt gar keinen Sinn?... Er springt da Byte-weise durch eine Datei und erwartet, bei jedem der möglichen/zufälligen Byte-Positionen in der Datei ein gültiges Wort lesen zu können?
Mal zusammengedampft auf alles das, was nicht gerade auskommentiert ist, um den Code auch lesen zu können (plus Entfernen der unnötigen for-Schleife ohne Body):
Java:
try (RandomAccessFile datei = new RandomAccessFile("woerter.dat","r")){
  int zufall = (int)(datei.length() * Math.random()); // zufällige BYTE-Position in der Datei
  long neuePosition= zufall; // <- merken
  zufall = datei.readUnsignedShort(); // 2 Byte lesen
  datei.skipBytes((int) (datei.getFilePointer() + zufall)); // 2+zufall Bytes überspringen. Der Cursor befindet sich nun also bei 4+zufall
  suchwort = new String(datei.readUTF()); // <- hier soll jetzt ein "Wort" stehen (UTF-8 String: 2-bytes Länge gefolgt von UTF-8 Bytes)
  anzeige = new StringBuilder(suchwort);
  for (int zeichen = 0; zeichen < suchwort.length(); zeichen++)
    anzeige.setCharAt(zeichen, '*');
  ausgabeText.setText(anzeige.toString());
}
Vielleicht sollte man erstmal klären, was denn das Dateiformat eigentlich ist. Textzeilen? Binärformat?
Und was genau unter einem "Wort" verstanden wird.
 
H

httpdigest

In dem Fall ist das Problem ja dann, dass du für eine gegebene (unveränderte) Datei immer exakt dieselbe Byte-Position liest, die sich aus den ersten zwei Byte des Dateiinhaltes ergibt:
Java:
zufall = datei.readUnsignedShort(); // 2 Byte lesen (von Position 0 der Datei)
datei.skipBytes((int) (datei.getFilePointer() + zufall)); // `2 + gelesenes UShort` Bytes überspringen.
suchwort = new String(datei.readUTF());
Da ist also kein Zufall drin.
 
mihe7

mihe7

Das schöne ist: Du weißt ja nicht, was aus der Datei gelesen wird :)
 
H

httpdigest

Und: Theoretisch kann ein zufälliger Prozess auch immer denselben Wert wie deine Methode liefern, nur ist die Wahrscheinlichkeit dafür halt sehr sehr klein. Aber möglich! :) Zufällig bedeutet ja nicht gleichverteilt oder über eine endliche Menge an Versuchen gleichverteilt.
 
mihe7

mihe7

Quelltext ist folglich eine zufällige Aneinanderreihung von Zeichen - da wird mir einiges klar.
 
J

JustNobody

Ach was. Das zeigt, wie unerfahren Ihr seid! Ihr habt absolut keine Ahnung von TEAM-Arbeit!

Toll Ein Anderer Machts - wer darin gut ist, der hat es gemeistert, in Foren wie hier so zu fragen, dass Andere die Arbeit erledigen.
Das ist ein TEAM Forum hier. Anfänger erkennt man daran, dass die dann die #300 voll kriegen. Aber es kommen auch viele Experten - keine 20 Posts und die Lösung wurde schon präsentiert ... Also das ihr hier immer noch glaubt, das es um Java gehen würde ... tz tz tz :)

Profiler Suzanne Grieger-Langer hatte da mal ein interessantes Video zu veröffentlicht. Da wurde das vom Prinzip her auch schön aufgezeigt. Aber ich finde es gerade nicht auf Anhieb wieder ...
 
O

Ollson70

Danke an alle. Einige Antworten hätte man sich auch sparen können.
Ich fine es schade, dass einem Anfänger so viel Mist erzählt wir. Ich finde, das auf eine Anfrage auch eine vernünftige Antwort zu erwarten ist.
Nochmals vielen Dank.
 
H

httpdigest

:D Ja, das Forum hier ist irgendwo zwischen Stackoverflow und YouTube Kommentaren.
 
mihe7

mihe7

Ich fine es schade, dass einem Anfänger so viel Mist erzählt wir. Ich finde, das auf eine Anfrage auch eine vernünftige Antwort zu erwarten ist.
Du hast doch drei vernünftige Antworten bekommen, die Probleme Deines Codes aufgezeigt haben. Für den Käse ab #6 habe ich mich ja schon vorab entschuldigt; dass das eine gewisse Eigendynamik entwickelt, ist hier normal :)

Du solltest vielleicht mal auf #5 antworten.
 
O

Ollson70

In dem Fall ist das Problem ja dann, dass du für eine gegebene (unveränderte) Datei immer exakt dieselbe Byte-Position liest, die sich aus den ersten zwei Byte des Dateiinhaltes ergibt:
Java:
zufall = datei.readUnsignedShort(); // 2 Byte lesen (von Position 0 der Datei)
datei.skipBytes((int) (datei.getFilePointer() + zufall)); // `2 + gelesenes UShort` Bytes überspringen.
suchwort = new String(datei.readUTF());
Da ist also kein Zufall drin.
Hallo,
Danke für die Antwort, wenn ich das richtig verstanden habe, ist es nicht möglich zufällig ein Wort aus einer Binärendatei zu bekommen. Sollte die
Worte in einer Textdatei hinterlegt sein würde es klappen. Gut, dann ändere ich meinen Editor entsprechend und versuche es mal damit.
 
H

httpdigest

wenn ich das richtig verstanden habe, ist es nicht möglich zufällig ein Wort aus einer Binärendatei zu bekommen.
Das hat hier niemand behauptet. Du tatest es mit deinem gezeigten Code nur nicht.

Lies dir nochmal die Antwort von @MoxxiManagarm durch: https://www.java-forum.org/thema/zufaelliges-wort-aus-einer-datei-einlesen.188667/#post-1224472

Da die Wörter/Strings immer unterschiedlich lang sind und an unterschiedlichen Offsets in der Datei stehen, musst du halt erstmal wissen, wieviele Wörter in der Datei sind und an welchen Byte-Offsets diese starten. Das kannst du halt machen, indem du einmal die Datei sequenziell einliest. Das ist ja möglich, weil jeweils zwei aufeinander folgende Wörter durch eine 2-Byte Länge getrennt sind und du somit weisst, wie lang jeweils das aktuelle Wort am aktuellen Cursor in der Datei ist.
Oder, du änderst das Format, indem du am Anfang der Datei einen Index pfegst, wo eben nur für jedes Wort sein Offset gespeichert ist.
 
mihe7

mihe7

Was auch funktionieren würde: bei einem zufälligen Byte-Offset starten, dann weiterlesen, bis zu einem Längenbyte (<65) :) (EDIT: das entspricht dem, was @MoxxiManagarm eingangs meinte).
 
Zuletzt bearbeitet:
Dimax

Dimax

String dasWort=woerter[Random];
oder darf man die Datei vorerst nicht komplett einlesen?
 
Thema: 

zufälliges Wort aus einer Datei einlesen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben