Kann ich in Java aus einem String ein zufälliges Wort ausgeben?
Hi Leute, ich würde gerne mal wissen, ob es möglich ist aus einem String:
String[] "..." = { "...", "...", "...", "...", "...", "..." };
einen Zufälligen Wert ausgeben zu lassen. Also wie in C++ nur eben unter Java :D Da geht das ja easy in Java mit:
string "..."[6] = { "...", "...", "...", "...", "...", "..." };
int randomnumber = rand() % 6;
cout << "Bla bla bla: " << "..."[randomnumber] << endl;
3 Antworten
Erst einmal, das:
String[] "..." = { "...", "...", "...", "...", "...", "..." };
ist kein String.Den ungültigen Bezeichner ("...") ignoriere ich an dieser Stelle einmal, aber du solltest wissen, das hier ein Array initialisiert wird, welches mehrere Strings enthält.
Die Lösung für dein Problem hast du im Prinzip schon selbst geschrieben, du musst sie nur noch in die richtige Sprache übersetzen:
String[] fruits = { "crawberry", "apple", "pear", "banana", "kiwi", "grape" };
int randomIndex = (int) (Math.random() * fruits.length);
System.out.println(fruits[randomIndex]);
Oder zwei weitere Lösungsmöglichkeiten zur Ermittlung des Index:
a)
int randomIndex = (int)(System.currentTimeMillis() % fruits.length);
b)
Die Verwendung der Klasse java.util.Random (https://docs.oracle.com/javase/9/docs/api/java/util/Random.html).
Unten, in den Kommentaren der Antwort von Ecaflip habe ich ein kurzes Beispiel gepostet. Du brauchst die Setter-Methode des Textfelds. Wenn der Nutzer mehrmals ein Zufallswort generieren können soll, dann braucht es ein Event (wie den Klick auf ein Element) sowie den darauf reagierenden Handler, der den Text neu setzt. Wozu du da ein if benötigst, weiß ich nicht. Vielleicht skizzierst du an dieser Stelle einmal genauer, was dein Modul überhaupt tun soll.
Oh das hab ich garnicht gesehen. Das if brauche ich um abzuchecken welcher Knopf gedrückt wurde. "Also Person A ist da" oder "Person A ist nicht da" und dann das selbe nochmal mit Person B. Das Problem ist, die eine Person A mag kein Ikea, die andere keinen Döner, deshalb hab ich auch 4 Strings. und mit der if-Abfrage check ich welcher Knopf gedrückt wurde.
public void onClick(View view) {
String[] Orte1 = {"Doenermann", "Chinetze", "Italiener", "Grieche", "Thailaender", "McDonalds", "Baecker"};
String[] Orte2 = {"Ikea", "Chinetze", "Italiener", "Grieche", "Thailänder", "McDonalds", "Bäcker"};
String[] Orte3 = {"Chinetze", "Italiener", "Grieche", "Thailänder", "McDonalds", "Bäcker"};
String[] Orte4 = {"Ikea", "Dönermann", "Chinetze", "Italiener", "Grieche", "Thailänder", "McDonalds", "Bäcker"};
if (view == btnErwinJa && view != btnErwinNein) {
int rand = (int) Math.floor((Math.random() * Orte1.length));
btnErgebnis.setText("Wir gehen heute zum: " + rand);
}
if (view != btnErwinJa && view == btnErwinNein) {
int rand = (int) Math.floor((Math.random() * Orte2.length));
btnErgebnis.setText("Wir gehen heute zum: " + rand);
}
if (view == btnErwinJa && view == btnErwinNein) {
int rand = (int) Math.floor((Math.random() * Orte3.length));
btnErgebnis.setText("Wir gehen heute zum: " + rand);
}
if (view != btnErwinJa && view != btnErwinNein) {
int rand = (int) Math.floor((Math.random() * Orte4.length));
btnErgebnis.setText("Wir gehen heute zum: " + rand);
}
}
Durch das Void geht leider auch kein return :(
Das Ergebnis wird dann in einem Button "btnErgebnis" ausgegeben. Hat halt den Vorteil, dass man sich nochmal n Ergebnis ausgeben lassen kann, wenns einem doch nicht passt.
Die Knöpfe bntErwinJa und nein erklären sich ja von selbst. Sind einfach die Knöpfe auf denen die Frage steht.
Hat sich ja erledigt, danke nochmal
Das mit dem String stimmt, ja, war nur das ihr das nennen könnt, wie ihr wollt.
Allerdings, ja, das klappt unter Java, fehlt nurnoch das ich es unter Android Studio zum laufen kriege, da geht println ja nicht. Kannst du mir da vielleicht auch helfen?
Du willst ein Array aus Strings mit Nummern von 1-6 füllen?
Da könntest du for (int i=0; i<array.length; i++){array[i]=""+(int)Math.random*6} benutzen
Also die Methode wäre hier foo:
Android.Studio(foo(Orte1));
foo(array[] array){
return array[(int)math.random*array.length];
}
Du gibst der methode eine Array mit und sie mach daraus die Rückgabe.
Achso. System.out.println(array[(int)math.random*array.length]); könnte dir das machen
Hmm ich weiss nicht genau wie du das meinst, aber du kannst statt es in der Konsole auszugeben (system.out), eine Methode machen, die das Ergebnis zurückgibt.
Genau das stimmt, danke. Ich nehme an, das wird dann direkt ausgegeben ne? Weißt du wie ich das dann in Android Studio in einem TextFeld ausgeben kann? Ich kenns von C++ nur so, dass man die Ausgabe in einer Variable speichert und die dann mit Cout ausgeben lassen kann.
Nutze die dafür vorgesehene Setter-Methode:
// e.g. in onCreate ...
final EditText textField = (EditText) findViewById(R.id.text);
textField.setText(getRandomWord(new String[] { "Doenermann", "Chinese", "Italiener", "Grieche", "Thailaender", "McDonalds", "Baecker" }));
// ...
}
static String getRandomWord(String[] words) {
int randomIndex = (int) (Math.random() * words.length);
return words[randomIndex];
}
Nicht ganz, der String ist schon vorhanden, befüllt mit Wörtern. Ich möchte aber ein zufälliges Wort davon ausgeben:
String[] Orte1 = { "Doenermann", "Chinetze", "Italiener", "Grieche", "Thailaender", "McDonalds", "Baecker" };
String[] data = {"a", "b", "c", "d", "e"};
int rand = (int)Math.floor((Math.random() * data.length));
System.out.println(data[rand]);
Allerdings gibt das nur Zahlen bei mir aus, statt die Buchstaben (Bei mir Wörter)
Dann machst du nicht das, was oben als Lösung vorgestellt wurde. Vielleicht lässt du dir nur den Wert von rand ausgeben.
Ich muss das Print Line weglassen, sonst stürzt die App ab, das funktioniert unter Android Studio ja nicht, unter Java generell aber schon. Mein Fehler, wusste ich nicht. Ich kann einem Button mit .setText daher leider auch kein println anhängen. Das ist mein neues Problem wies scheint. Ein int allerings schon, nur kann der ja keine Wörter.
Bisher gehts also nur mit dem rand-Wert: btnErgebnis.setText("Wir gehen heute zum: " + rand);
Du versteht wohl nicht, was die println-Methode macht, dabei ist ihr Name doch so deutlich: Sie gibt eine Zeichenkette aus. Bei System.out handelt es sich um einen Ausgabestream (PrintStream), der die Zeichenkette nach außen leitet, in die Konsole. Es gibt noch andere Arten an Ausgabestreams, die ihre Daten woanders hinleiten, bspw. in eine Datei.
Du benötigst aber keinen Stream. Der setText-Methode müssen nur die Daten übergeben werden. Die dazugehörige Komponente (Button, Textfeld, etc.) handhabt es intern, diese Daten auf der Oberfläche darzustellen.
Wie bei der Zahl reicht daher eine Konkatenation aus:
btnErgebnis.setText("Wir gehen heute zum: " + data[rand]);
Oder wenn du nur das Wort ausgeben möchtest:
btnErgebnis.setText(data[rand]);
Ich hab das "data" vergessen, oh man.. tut mir leid für den ganzen Aufwand
Oder bleibt mir nichts anderes übrig als in ner If abfrage den Wert "rand" abzufragen und dann für jeden wert ein btnErgebnis.setText zu schreiben?