5

文字列をスクランブリングして読みにくくしたかったので、次のメソッドを思いつきました。

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;

そのため、最初に文字列をchar配列に変換し、メソッドでchar配列「dummywordarray」を複製する必要がありました。このアルゴリズムを1回通過すると、単語のすべての文字の位置が変更されます。しかし、一目で元に戻すことができるという意味で、うまくスクランブルされることはありません。そのため、9文字未満の特定の文字列をメソッドに7回渡しましたが、単語はかなりスクランブルされています。つまり、判読できません。しかし、30文字の文字列で試してみたところ、うまくスクランブルされていることを保証できるようになるまでに500パスかかりました。500!より良いアルゴリズムがあると確信しています。a)この方法を改善するか、b)より良い方法についてアドバイスをお願いします。

4

1 に答える 1

19

どうですか

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

つまり、既存のjava.util.Collections.shuffle(List)方法を利用することができます。残念ながら、ジェネリックスではプリミティブを使用できないため、使用するにはいくつかのフープをジャンプする必要があります。

編集:

動作する基本的な方法shuffle(完全な説明についてはJavadocを参照)は次のとおりです。

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

編集2:

このアプローチは、GuavaのCharsユーティリティでは非常に冗長ではありません。

List<Character> chars = Chars.asList(word.toCharArray());
Collections.shuffle(chars);
String shuffledWord = new String(Chars.toArray(chars));
于 2010-11-22T16:44:17.167 に答える