Bland om samlinger i Java

1. Oversigt

I denne hurtige artikel vil vi se hvordan vi kan blande en samling i Java. Java har en indbygget metode til blanding Liste objekter - vi bruger det også til andre samlinger.

2. Bland en liste

Vi bruger metoden java.util.Collections.shuffle , som tager som input a Liste og blander det på plads. Ved på stedet mener vi, at det blander den samme liste som sendt i input i stedet for at oprette en ny med blandede elementer.

Lad os se på et hurtigt eksempel, der viser, hvordan man blander en Liste:

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

Der er en anden version af java.util.Collections.shuffle der også accepterer som input en brugerdefineret kilde til tilfældighed. Dette kan bruges til at gøre blanding til en deterministisk proces, hvis vi har et sådant krav til vores ansøgning.

Lad os bruge denne anden variant til at opnå den samme blanding på to lister:

Liste studerende_1 = Arrays.asList ("Foo", "Bar", "Baz", "Qux"); Liste studerende_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 bruger identiske tilfældighedskilder (initialiseret fra samme frøværdi), vil den genererede tilfældige talrækkefølge være den samme for begge blandinger. Efter blanding vil begge lister således indeholde elementer i nøjagtig samme rækkefølge.

3. Blanding af elementer i uordnede samlinger

Vi vil måske også blande andre samlinger som f.eks Sæt, kort, eller for eksempel, men alle disse samlinger er ikke ordnet - de opretholder ingen specifik rækkefølge.

Nogle implementeringer, f.eks LinkedHashMap, eller a Sæt med en Komparator - oprethold en fast rækkefølge, så vi kan heller ikke blande dem.

Imidlertid, vi kan stadig få adgang til deres elementer tilfældigt ved først at konvertere dem til a Listeog bland derefter dette Liste.

Lad os se et hurtigt eksempel på blanding af elementer i en Kort:

Kort 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åde kan vi blande elementer i en Sæt:

Sæt studerende = nyt HashSet (Arrays.asList ("Foo", "Bar", "Baz", "Qux")); Liste studentList = ny ArrayList (studerende); Collections.shuffle (studentList);

4. Konklusion

I denne hurtige vejledning så vi, hvordan man bruger java.util.Collections.shuffle for at blande forskellige samlinger i Java.

Dette fungerer naturligvis direkte med en Liste, og vi kan også bruge det indirekte til at randomisere rækkefølgen af ​​elementer i andre samlinger. Vi kan også kontrollere blandingsprocessen ved at tilvejebringe en brugerdefineret kilde til tilfældighed og gøre den deterministisk.

Som sædvanlig er al kode vist i denne artikel tilgængelig på GitHub.