Mezclar colecciones en Java

1. Información general

En este artículo rápido, veremos cómo podemos mezclar una colección en Java . Java tiene un método incorporado para mezclar objetos List ; lo utilizaremos también para otras colecciones.

2. Mezclar una lista

Usaremos el método java.util.Collections.shuffle , que toma como entrada una Lista y la baraja en su lugar. Por in situ, queremos decir que baraja la misma lista que se pasó en la entrada en lugar de crear una nueva con elementos barajados.

Veamos un ejemplo rápido que muestra cómo mezclar una lista :

List students = Arrays.asList("Foo", "Bar", "Baz", "Qux"); Collections.shuffle(students);

Hay una segunda versión de java.util.Collections.shuffle que también acepta como entrada una fuente personalizada de aleatoriedad. Esto se puede usar para hacer que la mezcla sea un proceso determinista si tenemos tal requisito para nuestra aplicación.

Usemos esta segunda variante para lograr la misma mezcla en dos listas:

List students_1 = Arrays.asList("Foo", "Bar", "Baz", "Qux"); List students_2 = Arrays.asList("Foo", "Bar", "Baz", "Qux"); int seedValue = 10; Collections.shuffle(students_1, new Random(seedValue)); Collections.shuffle(students_2, new Random(seedValue)); assertThat(students_1).isEqualTo(students_2);

Cuando se utilizan fuentes idénticas de aleatoriedad (inicializadas a partir del mismo valor inicial), la secuencia de números aleatorios generada será la misma para ambas combinaciones. Por lo tanto, después de barajar, ambas listas contendrán elementos exactamente en el mismo orden.

3. Mezcla de elementos de colecciones desordenadas

Es posible que queramos mezclar también otras colecciones, como Set, Map o Queue , por ejemplo, pero todas estas colecciones están desordenadas , no mantienen ningún orden específico.

Algunas implementaciones, como LinkedHashMap , o un conjunto con un comparador , mantienen un orden fijo, por lo que tampoco podemos mezclarlas.

Sin embargo, todavía podemos acceder a sus elementos de forma aleatoria convirtiéndolos primero en una Lista y luego barajando esta Lista .

Veamos un ejemplo rápido de cómo mezclar elementos de un mapa :

Map studentsById = new HashMap(); studentsById.put(1, "Foo"); studentsById.put(2, "Bar"); studentsById.put(3, "Baz"); studentsById.put(4, "Qux"); List
    
      shuffledStudentEntries = new ArrayList(studentsById.entrySet()); Collections.shuffle(shuffledStudentEntries); List shuffledStudents = shuffledStudentEntries.stream() .map(Map.Entry::getValue) .collect(Collectors.toList());
    

Del mismo modo, podemos mezclar elementos de un conjunto :

Set students = new HashSet( Arrays.asList("Foo", "Bar", "Baz", "Qux")); List studentList = new ArrayList(students); Collections.shuffle(studentList);

4. Conclusión

En este tutorial rápido, vimos cómo usar java.util.Collections.shuffle para mezclar varias colecciones en Java.

Esto, naturalmente, funciona directamente con una lista, y también podemos utilizarlo indirectamente para aleatorizar el orden de los elementos en otras colecciones. También podemos controlar el proceso de barajado proporcionando una fuente personalizada de aleatoriedad y haciéndola determinista.

Como de costumbre, todo el código que se muestra en este artículo está disponible en GitHub.