Embaralhar String com Collections.shuffle?

4 respostas
Guga360

Bem, eu fiz um pequeno exercício aqui para embaralhar uma String, até aí tudo bem, mas eu usei StringBuilder e um laço for para isso, mas eu sei que existe o Collections.shuffle...
Mas o que eu reparei é que eu não consigo fazer nenhuma List.

O meu código atual é esse.

public static String shuffle(String origem) {
    	Random r = new Random();
    	StringBuilder org = new StringBuilder(origem);
    	StringBuilder fim = new StringBuilder();    	
    	int tamanho = org.length();
    	    	    	
    	for (int i=0;i<tamanho;i++) {
    		int rch = r.nextInt(org.length());
    		fim.append(org.charAt(rch));
    		org = org.deleteCharAt(rch);
    	}    	
    	return fim.toString();    	 
    }

Eu queria algo mais ou menos assim:

public static String shuffle(String origem) {
 List<char> lista = new ArrayList<char>(Arrays.asList(origem.toCharArray()));
 Collections.shuffle(lista);
 return ...
 }
O problema é que eu não consigo fazer uma lista com , nem com . Esse é o único jeito de fazer o exercício? Vou ter que realmente usar um laço for com StringBuilder ao em vez de Collections.shuffle?

Obrigado para quem me responder =)

4 Respostas

victorwss

Isso não funciona?public static String shuffle(String origem) { char[] arr = origem.toCharArray(); Collections.shuffle(Arrays.asList(arr)); return new String(arr); }
EDIT: hmm. Há algo errado ainda. Deixa eu ver o que é.

Guga360

Aparentemente, não funcionou.

found   : void

required: java.util.List<java.lang.Character>

List lista = Collections.shuffle(Arrays.asList(arr));
sergiotaborda

Listas são de objetos. Use List
Arrays podem ser primitivos ou não. Utilize um array de char que pesa menos que uma lista de Character

O problema é que não existe um Arrays.suffle
Portanto tem que converter para List . Na mão!, porque Arrays.asList tb não irá funcionar (um char não é um Character e viceversa

O mais eficietne seria randomizar o array , mas aqui fica o exemplo com suffle

char[] caracteres = "String a embaralhar".toCharArray();

List<Character> ocharaters  = new ArrayList<Character>(caracteres.length);

for (char c:  caracteres ){
  ocharaters.add(c); // autoboxing
}

Collections.suffle(ocharaters);

for ( int i =0; i < caracteres.length ; i++ ){
     caracteres[i] = ocharaters.get(i); // unboxing
}

String strEmbaralhada = new String(caracteres);
Guga360

Bom, acho que minha dúvida foi resolvida com o código acima

Mas de qualquer modo meu código vai ficar um pouquinho longo, mas vou ficar com o meu código mesmo.
E o que percebi também é que eu estava fazendo Arrays.asList( str.toCharArray() ), e isso seria uma “Lista de arrays” porque str.toCharArray() retorna char[] e não os argumentos para asList :stuck_out_tongue:

No fim acabei fazendo o programa assim mesmo.

Criado 20 de outubro de 2008
Ultima resposta 21 de out. de 2008
Respostas 4
Participantes 3