Verzamelingen in Java in willekeurige volgorde afspelen

1. Overzicht

In dit korte artikel zullen we zien hoe we een collectie in Java kunnen schudden. Java heeft een ingebouwde methode om te schudden Lijst objecten - we gebruiken het ook voor andere collecties.

2. Een lijst in willekeurige volgorde afspelen

We zullen de methode gebruiken java.util.Collections.shuffle , die als invoer een Lijst en schudt het op zijn plaats. Met in-place bedoelen we dat het dezelfde lijst schudt die in de invoer is doorgegeven in plaats van een nieuwe te maken met geschudde elementen.

Laten we eens kijken naar een snel voorbeeld dat laat zien hoe u een Lijst:

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

Er is een tweede versie van java.util.Collections.shuffle die ook als invoer een aangepaste bron van willekeur accepteert. Dit kan worden gebruikt om het shuffelen tot een deterministisch proces te maken als we een dergelijke vereiste hebben voor onze applicatie.

Laten we deze tweede variant gebruiken om hetzelfde geschud op twee lijsten te bereiken:

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

Bij gebruik van identieke bronnen van willekeur (geïnitialiseerd op basis van dezelfde seed-waarde), zal de gegenereerde reeks van willekeurige getallen hetzelfde zijn voor beide shuffles. Na het schudden zullen beide lijsten dus elementen in exact dezelfde volgorde bevatten.

3. Elementen van ongeordende verzamelingen in willekeurige volgorde afspelen

We willen misschien ook andere collecties in willekeurige volgorde afspelen, zoals Set, kaart, of Wachtrij, bijvoorbeeld, maar al deze collecties zijn ongeordend - ze handhaven geen specifieke volgorde.

Sommige implementaties, zoals LinkedHashMap, of een Set met een Comparator - houd een vaste volgorde aan, dus we kunnen ze ook niet door elkaar halen.

Echter, we hebben nog steeds willekeurig toegang tot hun elementen door ze eerst om te zetten in een Lijst, en dit vervolgens in willekeurige volgorde afspelen Lijst.

Laten we eens kijken naar een snel voorbeeld van het door elkaar schudden van elementen van een Kaart:

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

Evenzo kunnen we elementen van een Set:

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

4. Conclusie

In deze korte handleiding hebben we gezien hoe u java.util.Collections.shuffle om verschillende verzamelingen in Java door elkaar te halen.

Dit werkt natuurlijk direct met een Lijst, en we kunnen het indirect gebruiken om de volgorde van elementen in andere collecties ook willekeurig te maken. We kunnen het schudproces ook controleren door een aangepaste bron van willekeur te bieden en deze deterministisch te maken.

Zoals gewoonlijk is alle code die in dit artikel wordt gedemonstreerd, beschikbaar op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found