Pergunta

Eu queria lutar uma corda, para torná -la ilegível e, portanto, criei este método:

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;

Por isso, converti a string pela primeira vez em uma matriz de char e, no meu método, tive que duplicar a matriz Char "DummyWordArray". Passar uma vez por esse algoritmo, todos os letidos da palavra mudarão de posição. Mas não será muito bom, no sentido de que você poderia montá -lo de volta de volta. Então, passei por uma determinada sequência de menos de 9 caracteres através do método 7 vezes, e as palavras são bastante bem embaralhadas, ou seja, ilegível. Mas eu tentei com uma corda de 30 caracteres e foram necessários 500 passes antes que eu pudesse garantir que fosse bem embaralhado. 500! Tenho certeza de que há um algoritmo melhor, gostaria de alguns conselhos sobre a) melhorar esse método oub) uma maneira melhor.

Foi útil?

Solução

Que tal

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

Em outras palavras, você pode tirar proveito do existente java.util.Collections.shuffle(List) método. Infelizmente, você precisa pular por alguns aros para usá -lo, pois não pode usar primitivas em genéricos.

Editar:

A maneira básica que shuffle Trabalhos (veja o javadoc para a explicação completa), é assim:

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

Editar 2:

Esta abordagem é significativamente menos detalhada com a goiaba Chars Serviços de utilidade pública:

List<Character> chars = Chars.asList(word.toCharArray());
Collections.shuffle(chars);
String shuffledWord = new String(Chars.toArray(chars));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top