2008-10-08 12 views
6

Me estoy frustrando mucho porque no puedo entender por qué la mezcla de colecciones no funciona correctamente.Uso de colecciones API para barajar

Digamos que estoy tratando de mezclar la matriz randomizer.

int[] randomizer = new int[] {200,300,212,111,6,2332}; 
Collections.shuffle(Arrays.asList(randomizer)); 

Por alguna razón, los elementos se mantienen ordenados exactamente igual si llamo o no al método de reproducción aleatoria. ¿Algunas ideas?

+0

Ver también [este duplicado] (http://stackoverflow.com/questions/3981420/collections-shuffle) – basZero

Respuesta

18

Arrays.asList no se puede utilizar con matrices de primitivas. Use este lugar:

Integer[] randomizer = new Integer[] {200,300,212,111,6,2332}; 
Collections.shuffle(Arrays.asList(randomizer)); 

La misma regla se aplica a la mayoría de las clases en el marco de las colecciones, en la que no se puede utilizar tipos primitivos.

El código original (con int[]) compilado bien, pero no funcionó como se esperaba, debido al comportamiento del método variadic asList: sólo hace una lista de un solo elemento, con la matriz int como su único miembro.

+0

¡buena captura! Estaba pensando que el problema era que la lista se ordenaría, pero no la matriz original, pero los javadocs en Arrays.asList dice que la lista usa la matriz subyacente. Si creces esta lista, ¡tendrás un problema! (la matriz será reemplazada por una nueva matriz) –

+0

gracias por la explicación clara – VeePee

+0

Encantador ... otro caso donde el Autoboxing/Unboxing no funciona como se esperaba (o en este caso, simplemente no se aplica). –

0

Chris 'la respuesta es correcta.

Como dije en un comentario sobre la respuesta de Chris, la matriz subyacente cambiará apropiadamente a menos que la lista de arrays necesite crecer, y la lista cree una nueva y copie los elementos en ella.

Es posible que desee mantener una referencia a la lista e iterar sobre eso después de la llamada Arrays.asList, y no repetir sobre la matriz después de eso, iterar sobre la lista en su lugar.

+0

Si bien mi respuesta es correcta, desafortunadamente, la tuya no. :-(La lista devuelta por 'Arrays.asList' es de tipo' java.util.Arrays $ ArrayList', y a diferencia de 'java.util.ArrayList', no se puede cambiar de tamaño (se lanza una' UnsupportedOperationException' si lo intenta). Entonces, la lista devuelta siempre está respaldada por la matriz dada. –

Cuestiones relacionadas