Riordinare le raccolte in Java

1. Panoramica

In questo breve articolo, vedremo come possiamo mescolare una raccolta in Java . Java ha un metodo integrato per mescolare gli oggetti List : lo utilizzeremo anche per altre raccolte.

2. Mescolare un elenco

Useremo il metodo java.util.Collections.shuffle , che prende come input un List e lo mescola sul posto. Per posto, si intende che mescola lo stesso elenco passato in input invece di crearne uno nuovo con elementi mescolati.

Diamo un'occhiata a un rapido esempio che mostra come mescolare una lista :

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

Esiste una seconda versione di java.util.Collections.shuffle che accetta anche come input una fonte personalizzata di casualità. Questo può essere usato per rendere il mescolamento un processo deterministico se abbiamo un tale requisito per la nostra applicazione.

Usiamo questa seconda variante per ottenere lo stesso mescolamento su due elenchi:

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

Quando si utilizzano fonti identiche di casualità (inizializzate dallo stesso valore di inizializzazione), la sequenza di numeri casuali generata sarà la stessa per entrambi i mescolamenti. Quindi, dopo aver mescolato, entrambi gli elenchi conterranno elementi nello stesso identico ordine.

3. Mescolare elementi di raccolte non ordinate

Potremmo voler mescolare anche altre raccolte come Set, Map o Queue , ad esempio, ma tutte queste raccolte non sono ordinate : non mantengono alcun ordine specifico.

Alcune implementazioni, come LinkedHashMap o Set with a Comparator , mantengono un ordine fisso, quindi non possiamo neanche mescolarle.

Tuttavia, possiamo ancora accedere ai loro elementi in modo casuale convertendoli prima in un elenco , quindi mescolando questo elenco .

Vediamo un rapido esempio di mescolare gli elementi di una mappa :

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

Allo stesso modo, possiamo mescolare gli elementi di un Set :

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

4. Conclusione

In questo breve tutorial, abbiamo visto come utilizzare java.util.Collections.shuffle per mescolare varie raccolte in Java.

Questo naturalmente funziona direttamente con un elenco e possiamo utilizzarlo indirettamente per randomizzare anche l'ordine degli elementi in altre raccolte. Possiamo anche controllare il processo di mescolamento fornendo una fonte personalizzata di casualità e renderla deterministica.

Come al solito, tutto il codice mostrato in questo articolo è disponibile su GitHub.