Buchstaben zufällig drehen

02/08/2015 17:29 The_Dentist#1
Hallo,

Ich stehe wieder vor einem kleinen Problem.

Und zwar soll ich eine Methode schreiben, welche zufällig einen String verdreht, falls man das so nennen kann.

z.B. das Wörtchen "Ein" wird zu "Ien" oder "Nie" usw. Dieses zufällig verdrehte Wort soll nun ausgeben werden.

Mein Ansatz sieht wie folgt aus:

Ich habe z.B. das Wort "Auto"

Nun wäre der erste Schritt eine zufällig generierte Zahl zu erzeugen.
Nehmen wir an diese Zahl ist 2.
Das heißt das t wird an die erste Stelle meines neuen Strings geschrieben.

Jetzt kommt der Part an dem ich hänge, dieses t muss nun logischerweise entfernt werden, sodass ich es nicht nochmal ziehen kann.


So sieht aktuell mein Code aus, allerdings werden da noch nicht die Zeichen entfernt und ich kann z.B. 4 mal gleichen Buchstaben wieder bekommen. Dabei bräuchte ich nun Hilfe.


Vielen Dank!

Gruß
02/08/2015 19:26 lordsill#2
Eine Möglichkeit wäre, dass du eine weitere String-Variable hinzufügst, in der am Anfang der String in (Parameter der Methode) steht.
Innerhalb der for-Schleife dann eine weitere for-Schleife, die dann das Wort "kopiert", jedoch den Buchstaben an der Stelle rnd nicht dem Wort hinzufügt.

Also:

String in; -> Bleibt das Ursprungswort, dass der Methode übergeben wird
int rnd; -> Zufallszahl für den Buchstaben
String result; -> Das Wort mit der zufälligen Reihenfolge der Buchstaben
String temp; -> temporäre Variable. String wird kopiert jedesmal den String von in und übernimmt alle Buchstaben außer den Zufallssbuchstaben :: String in wird am Ende mit temp überschrieben

Zweite Möglichkeit:
Du speicherst, welche Zufallszahlen du bereits gezogen hast. Wurde per Zufall wieder eine Zahl gezogen, die bereits gezogen wurde, wird einfach solange eine neue Zufallszahl erzeugt, bis du eine Zahl hast, die noch nicht gezogen wurde.

Edit:
Wenn du nicht genau wissen solltest, wie es gemeint ist, kannst du dir den Code hier ansehen. Solltest es jedoch vorher erstmal selbst probieren, bevor du den Code anschaust.
[Only registered and activated users can see links. Click Here To Register...]
(Methode 2 könnte man besser machen, wenn man statt dem Array eine Liste verwenden würde)

with best regards/Mit freundlichen Grüßen
LordSill
02/08/2015 21:45 Zunft#3
Ich würde es so lösen - ist um einiges eleganter und spart Peformance/Zeit:

Code:
    public static String random_string(String in) {
        char[] charset = in.toCharArray(); //Input String in CharArray umwandeln
        List<Character> characters = new ArrayList<Character>();
        for(char c : charset) //Jeden char
        {
            characters.add(c); //In die Liste hinzufügen
        }
        String out = "";
        while(characters.size() != 0) //Solange Buchstaben vorhanden sind
        {
            int rnd = (int)(Math.random() * characters.size()); //Erzeuge eine zufallszahl zwischen 0 und der Anzahl der Buchstaben
            out += characters.remove(rnd); //Füge den zufälligen Buchstaben dem Outputstring hinzu und lösche diesen Eintrag, damit kein Buchstabe doppelt gewertet wird
        }
        return out;
    }
02/27/2015 00:04 meinselite#4
Code:
public class Test {
	
	public static void main(String[] args) {
		
		String txt = "Ein"; //Dein String das gemischt werden soll
		
		txt = mixLetters(txt);
		
		System.out.println(txt);
	}
	
	public static String mixLetters(String str) {
		
		str = str.toLowerCase(); //alle Buchstaben klein
		String strMixed = "";
		int[] nums = randNumbers(str.length());
		
		for(int i = 0;i<str.length();i++) {
			if(i == 0)
				strMixed += (str.toCharArray()[nums[i]]+"").toUpperCase(); //Anfangsbuchstabe ist groß
			else
				strMixed += str.toCharArray()[nums[i]]; //Buchstaben in der Reihenfolge der Zufallszahlen
		}
		
		return strMixed;
	}
	
	private static int[] randNumbers(int strLength) { //Zahlen zwischen 0 und strLength
		
		int[] randPos = new int[strLength];
		for(int i = 0;i<randPos.length;i++) //da standardmaessig jedes Element mit 0 belegt ist
			randPos[i] = -1;
		int randNum = 0;
		
		for(int i = 0;i<randPos.length;i++) {
			
			randNum = (int) (Math.random()*strLength);
			
			for(int j = 0;j<randPos.length;j++) {
				
				if(randPos[j] == randNum) { //bis randNum noch nicht verwendet wurde
					randNum = (int) (Math.random()*strLength);
					j = -1;
				}
			}
			
			randPos[i] = randNum;
		}
		
		return randPos;
	}
}
meinselite