質問

文字列をスクランブルして読めなくしたかったので、この方法を思いつきました。

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

役に立ちましたか?

解決

どうでしょうか

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));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top