metodo array java

metodo - shuffle array java



¿Por qué Collections.shuffle() falla para mi matriz? (4)

¿Por qué mi código no funciona?

package generatingInitialPopulation; import java.util.Arrays; import java.util.Collections; public class TestShuffle { public static void main(String[] args) { int[] arr = new int[10]; for (int i = 0; i < arr.length; i++) { arr[i] = i; } Collections.shuffle(Arrays.asList(arr)); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } }

El resultado es: 0 1 2 3 4 5 6 7 8 9.

Esperaba una secuencia aleatoriamente barajada.


Almacene la lista devuelta por Arrays.asList y baraje que ...

List myShuffledList = Arrays.asList(arr); Collections.shuffle(myShuffledList);


Eso no funciona porque la llamada a shuffle está operando en la List devuelta por Arrays.asList , no en la matriz subyacente. Por lo tanto, cuando se itera sobre la matriz para imprimir los valores, nada ha cambiado. Lo que desea hacer es guardar una referencia a la List devuelta por Arrays.asList , y luego imprimir los valores de esa List (en lugar de los valores de la matriz) después de shuffle .


Intente agregar esta línea de código a su prueba:

List l=Arrays.asList(arr); System.out.println(l);

Verá que está imprimiendo una List elementos individuales.

El uso de Arrays.asList en una matriz primitiva hace que asList trate el int[] como un solo objeto en lugar de una matriz. Devuelve una List<int[]> lugar de una List<Integer> . Entonces, básicamente estás barajando una List un solo elemento y así nada se baraja.

Observe que algunas de las respuestas ya dadas son incorrectas porque asList devuelve una Lista respaldada por la matriz original, nada se copia, todos los cambios se reflejan en la matriz original.


Arrays.asList() no se puede aplicar a matrices de tipo primitivo como espera. Cuando se aplica a int[] , Arrays.asList() produce una lista de int[] s en lugar de una lista de Integer . Por lo tanto, barajan una lista recién creada de int[] .

Este es un comportamiento sutil de diversos argumentos y genéricos en Java. Arrays.asList() se declara como

public static <T> List<T> asList(T... a)

Por lo tanto, puede tomar varios argumentos de algún tipo T y generar una lista que contenga estos argumentos, o puede tomar un argumento de tipo T[] y devolver una lista respaldada por esta matriz (así es como funcionan los argumentos variables).

Sin embargo, la última opción funciona solo cuando T es un tipo de referencia (es decir, no es un tipo primitivo como int ), porque solo los tipos de referencia pueden usarse como parámetros de tipo en genéricos (y T es un parámetro de tipo).

Por lo tanto, si pasa int[] , obtiene T = int[] , y el código no funciona como se esperaba. Pero si pasa una matriz de tipo de referencia (por ejemplo, Integer[] ), obtiene T = Integer y todo funciona:

Integer[] arr = new Integer[10]; for (int i = 0; i < arr.length; i++) { arr[i] = i; } Collections.shuffle(Arrays.asList(arr)); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); }