Mélanger les collections en Java

Mélanger les collections en Java

1. Vue d'ensemble

Dans cet article rapide, nous verronshow we can shuffle a collection in Java. Java a une méthode intégrée pour mélanger les objets deList - nous l’utiliserons également pour d’autres collections.

2. Mélanger une liste

We’ll use the method [.pl-smi]#java.util.Collections.shuffle [.blob-code-inner] [. pl-smi], qui ### prend comme entrée unList et le mélange sur place. Par in-situ, on entend qu'il mélange la même liste que celle passée en entrée au lieu d'en créer une nouvelle avec des éléments mélangés.

Examinons un exemple rapide montrant comment mélanger unList:

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

There’s a second version of [.pl-smi]#java.util.Collections.shuffle [.blob-code-inner] [. pl-smi]that also accepts as input a custom source of randomness. Cela peut être utilisé pour faire du mélange un processus déterministe si nous avons une telle exigence pour notre application.#

[.pl-smi]#Let’s use this second variant to achieve the same shuffling on two lists: #

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);

When using identical sources of randomness (initialized from same seed value), the generated random number sequence will be the same for both shuffles. Ainsi, après mélange, les deux listes contiendront des éléments exactement dans le même ordre.

3. Mélange d'éléments de collections non ordonnées

We may want to shuffle other collections as well such as Set, Map, or Queue, for example, but all these collections are unordered - ils ne maintiennent aucun ordre spécifique.

Certaines implémentations, telles queLinkedHashMap, ou unSet avec unComparator - maintiennent un ordre fixe, donc nous ne pouvons pas non plus les mélanger.

Cependant,we can still access their elements randomly by converting them first into a List, then shuffling this List.

Voyons un exemple rapide de mélange d'éléments d'unMap:

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());

De même, nous pouvons mélanger les éléments d'unSet:

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

4. Conclusion

Dans ce rapide tutoriel, nous avons vu comment utiliser[.pl-smi]#java.util.Collections.shuffle [.blob-code-inner] [. Pl-smi] # pour mélanger diverses collections en Java. ##

Cela fonctionne naturellement directement avec unList, et nous pouvons également l'utiliser indirectement pour randomiser l'ordre des éléments dans d'autres collections. Nous pouvons également contrôler le processus de mélange en fournissant une source personnalisée d'aléa et en le rendant déterministe.

Comme d'habitude, tout le code présenté dans cet article est disponibleover on GitHub.