2010-12-02 9 views
5

me he dado cuenta de que la matriz int subyacente está cambiándose dada la forma en la lista se está creando:matriz java barajar

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.List; 
import java.util.Random; 


public class Shuffling { 

    static Integer[] intArr = {1, 2, 3, 4, 5}; 
    static Random random = new Random(7); 
    public static void main(String[] args) { 

     List<Integer> intList = new ArrayList<Integer>(Arrays.asList(intArr)); 
     Collections.shuffle(intList, random); 
     System.out.println("List after shuffling: " + intList); 
     System.out.println("intArr: " + Arrays.toString(intArr)); 
     //OUTPUT: 
     //List after shuffling: [5, 4, 1, 3, 2] 
     //intArr: [1, 2, 3, 4, 5] 


     List<Integer> intList2 = Arrays.asList(intArr); 
     Collections.shuffle(intList2, random); 
     System.out.println("List2 after shuffling: " + intList2); 
     System.out.println("intArr: " + Arrays.toString(intArr)); 
     //OUTPUT: 
     //List2 after shuffling: [5, 3, 4, 2, 1] 
     //intArr: [5, 3, 4, 2, 1] 
    } 
} 

¿Por qué está sucediendo?

Respuesta

8

Arrays.asList() construye una lista especial respaldada por la matriz original.

Por eso la lista no es compatible con los métodos (opcionales) add() y remove() de la interfaz Colección (no sería posible usar una matriz).

Curiosamente, la clase devuelta se llama ArrayList, aunque no debe confundirse con java.util.ArrayList.

System.out.println(
    Arrays.asList("1", "2", "3") 
    .getClass().getName() 
); 
// Output: java.util.Arrays$ArrayList 
+0

('Collections.shuffle (Arrays.asList (.));' Se menciona en los Rompecabezas de Java de Bloch & Gafter. No en línea de forma gratuita, pero la salida original de la pregunta está aquí: http: //blogs.sun .com/mary/entry/puzzler_solved_winner_s_identified) –

+0

* La prueba de Tom Hawtin también es correcta [...]. La solución de Tom, sin embargo, rocas *. Bonito, se quita el sombrero. :-) –

2

citar el API link text:

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

Devuelve una lista de tamaño fijo el respaldo de la matriz especificada. (Cambios a la lista devuelta "escribir" en la matriz.)

Por lo tanto, cualquier cambio que realice en intList2 tendrá un efecto en intArr. El constructor de ArrayList en el otro lado, copiará los elementos, por lo que los cambios realizados en el orden en intlist no afectarán intArr (porque los elementos se copian)

3

De javadoc para Arrays.asList(T... a):

Devuelve una la lista de tamaño fijo respaldada por la matriz especificada. (Cambios a la lista devuelta "escribir" en la matriz.)

0

El cambio real está en la semilla aleatoria que se pasa al método aleatorio. Cada vez que se llama al método aleatorio obtiene el siguiente número diferente de la instancia aleatoria.

1
List<Integer> intList = new ArrayList<Integer>(Arrays.asList(intArr)); 

En intlist que tiene una copia superficial de la matriz. Copia superficial significa que copió solo la matriz, no los elementos que contiene. (También hay una copia profunda. Significa una copia completa de la matriz).

List<Integer> intList2 = Arrays.asList(intArr); 

En intList2 que tiene la misma matriz. Ni siquiera una copia superficial. Siempre que cambie intList2, también modifica intArr.