Tilfeldig samlinger i Java

1. Oversikt

I denne raske artikkelen får vi se hvordan vi kan blande en samling på Java. Java har en innebygd metode for blanding Liste objekter - vi bruker den også til andre samlinger.

2. Bland en liste

Vi bruker metoden java.util.Collections.shuffle , som tar som input a Liste og stokker den på plass. Med på stedet mener vi at den blander den samme listen som sendt i input i stedet for å lage en ny med blandede elementer.

La oss se på et raskt eksempel som viser hvordan du blander en Liste:

Liste studenter = Arrays.asList ("Foo", "Bar", "Baz", "Qux"); Collections.shuffle (studenter);

Det er en andre versjon av java.util.Collections.shuffle som også aksepterer en tilpasset tilfeldighetskilde. Dette kan brukes til å gjøre blanding til en deterministisk prosess hvis vi har et slikt krav til søknaden vår.

La oss bruke denne andre varianten for å oppnå den samme blandingen på to lister:

Liste students_1 = Arrays.asList ("Foo", "Bar", "Baz", "Qux"); Liste 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);

Når du bruker identiske kilder til tilfeldighet (initialisert fra samme frøverdi), vil den genererte tilfeldige tallsekvensen være den samme for begge blandingene. Dermed vil begge listene etter blanding inneholde elementer i nøyaktig samme rekkefølge.

3. Blanding av elementer i uordnede samlinger

Det kan være lurt å blande andre samlinger også som Sett, kart, eller , for eksempel, men alle disse samlingene er ikke ordnet - de opprettholder ingen spesifikk ordre.

Noen implementeringer, som f.eks LinkedHashMap, eller a Sett med en Komparator - opprettholder en fast rekkefølge, slik at vi heller ikke kan stokke dem.

Derimot, vi kan fremdeles få tilgang til elementene deres tilfeldig ved å konvertere dem først til a Liste, og stokker deretter dette Liste.

La oss se et raskt eksempel på blanding av elementer i en Kart:

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

På samme måte kan vi blande elementer av en Sett:

Sett studenter = nye HashSet (Arrays.asList ("Foo", "Bar", "Baz", "Qux")); Liste studentList = ny ArrayList (studenter); Collections.shuffle (studentList);

4. Konklusjon

I denne raske opplæringen så vi hvordan du bruker java.util.Collections.shuffle for å blande forskjellige samlinger i Java.

Dette fungerer naturlig nok direkte med en Liste, og vi kan bruke den indirekte til å randomisere rekkefølgen av elementer i andre samlinger også. Vi kan også kontrollere blandingsprosessen ved å tilby en tilpasset kilde til tilfeldighet og gjøre den deterministisk.

Som vanlig er all kode som er demonstrert i denne artikkelen tilgjengelig på GitHub.


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