Question

Je voulais scramble une chaîne, pour le rendre illisible et donc venu avec cette méthode:

public String scrambleWord(String start_word){

     char[] wordarray = start_word.toCharArray();

        char[] dummywordarray = start_word.toCharArray();

        Random random = new Random();

        int r = random.nextInt(wordarray.length-1);
        int i = 0;

        int j = r+1;

        while(i <= r){

            dummywordarray[wordarray.length -i-1] = wordarray[i];

            i++;
        }


        while (j <= wordarray.length -1){

            dummywordarray[j-r-1] = wordarray[j];

            j++;

        }

        String newword = String.valueOf(dummywa);



        return newword;

J'ai d'abord converti la chaîne à un tableau de caractères, et dans ma méthode que je devais reproduire le tableau de caractères « dummywordarray ». En passant une fois par cet algorithme chaque lette ROF le mot aura changé de position. Mais il ne sera brouillée très bien, dans le sens que vous pourriez remettre ensemble un coup d'oeil. SO I passé une chaîne donnée de moins de 9 caractères par la méthode 7 fois, et les mots sont assez bien brouillés, à savoir illisible. Mais je l'ai essayé avec une chaîne de 30 caractères et il a fallu 500 passes avant que je puisse le garantir était bien brouillée. 500! Je suis sûr qu'il ya un meilleur algorithme, je voudrais quelques conseils soit a) l'amélioration de ce procédé ou b) une meilleure façon.

Était-ce utile?

La solution

Qu'en est-

ArrayList<Character> chars = new ArrayList<Character>(word.length());
for ( char c : word.toCharArray() ) {
   chars.add(c);
}
Collections.shuffle(chars);
char[] shuffled = new char[chars.size()];
for ( int i = 0; i < shuffled.length; i++ ) {
   shuffled[i] = chars.get(i);
}
String shuffledWord = new String(shuffled);

En d'autres termes, vous pouvez profiter de l'existant java.util.Collections.shuffle(List) de la méthode. Malheureusement, vous devez sauter à travers quelques cerceaux de l'utiliser, puisque vous ne pouvez pas utiliser les primitives Generics.

Edit:

La méthode de base que les travaux de shuffle (voir la documentation Java pour l'explication complète), est comme ceci:

for position = last_index to first_index
   let swap_pos = random number between first_index and position, inclusive
   swap(swap_pos, position)

Edit 2:

Cette approche est beaucoup moins bavard avec de goyave Chars utilitaires:

List<Character> chars = Chars.asList(word.toCharArray());
Collections.shuffle(chars);
String shuffledWord = new String(Chars.toArray(chars));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top