Kann ich in Java aus einem String ein zufälliges Wort ausgeben?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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).


Justinzockt99 
Beitragsersteller
 31.01.2018, 09:56

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?

regex9  31.01.2018, 11:02
@Justinzockt99

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.

Justinzockt99 
Beitragsersteller
 31.01.2018, 12:09
@regex9

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.

Justinzockt99 
Beitragsersteller
 31.01.2018, 09:38

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

Woher ich das weiß:Berufserfahrung – Programmierer

Ecaflip  30.01.2018, 13:15

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.

Ecaflip  30.01.2018, 12:00

Achso. System.out.println(array[(int)math.random*array.length]); könnte dir das machen

Ecaflip  30.01.2018, 13:11

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.

Ecaflip  30.01.2018, 12:01

array musst du natürlich durch 'Orte1' ersetzen.

Justinzockt99 
Beitragsersteller
 30.01.2018, 12:07
@Ecaflip

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.

regex9  30.01.2018, 23:47
@Justinzockt99

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];
}
Justinzockt99 
Beitragsersteller
 30.01.2018, 11:59

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]);

Justinzockt99 
Beitragsersteller
 30.01.2018, 17:01

Allerdings gibt das nur Zahlen bei mir aus, statt die Buchstaben (Bei mir Wörter)

regex9  30.01.2018, 23:50
@Justinzockt99

Dann machst du nicht das, was oben als Lösung vorgestellt wurde. Vielleicht lässt du dir nur den Wert von rand ausgeben.

Justinzockt99 
Beitragsersteller
 31.01.2018, 09:34
@regex9

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);
regex9  31.01.2018, 11:54
@Justinzockt99

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]);
Justinzockt99 
Beitragsersteller
 31.01.2018, 12:26
@regex9

Ich hab das "data" vergessen, oh man.. tut mir leid für den ganzen Aufwand