Premještanje kolekcija u Javi

1. Pregled

U ovom brzom članku vidjet ćemo kako možemo promiješati kolekciju na Javi. Java ima ugrađenu metodu za miješanje Popis objekata - koristit ćemo ga i za druge zbirke.

2. Premještanje popisa

Upotrijebit ćemo metodu java.util.Collections.shuffle , koji uzima kao ulaz a Popis i miješa ga na mjestu. Pod in-place, podrazumijevamo da miješa isti popis kao i prosljeđeni u unosu, umjesto da stvara novi s promiješanim elementima.

Pogledajmo kratki primjer koji pokazuje kako promiješati a Popis:

Popis učenika = Arrays.asList ("Foo", "Bar", "Baz", "Qux"); Collections.shuffle (studenti);

Postoji druga verzija java.util.Collections.shuffle koji također prihvaća kao ulaz prilagođeni izvor slučajnosti. To se može koristiti za preslikavanje determinističkim postupkom ako imamo takav zahtjev za našu aplikaciju.

Upotrijebimo ovu drugu varijantu za postizanje istog miješanja na dva popisa:

Popis učenika_1 = Arrays.asList ("Foo", "Bar", "Baz", "Qux"); Popis students_2 = Arrays.asList ("Foo", "Bar", "Baz", "Qux"); int sjemeVrijednost = 10; Collections.shuffle (students_1, novi Random (seedValue)); Collections.shuffle (students_2, novi Random (seedValue)); assertThat (students_1) .isEqualTo (students_2);

Kada se koriste identični izvori slučajnosti (inicijalizirani iz iste početne vrijednosti), generirani redoslijed slučajnih brojeva bit će jednak za oba miješanja. Stoga će nakon miješanja oba popisa sadržavati elemente u potpuno istim redoslijedom.

3. Miješanje elemenata nesređenih kolekcija

Možda bismo htjeli promiješati i druge kolekcije kao što je Set, Map, ili Red, na primjer, ali sve su ove kolekcije neuređene - ne održavaju nikakav određeni redoslijed.

Neke implementacije, kao što su LinkedHashMap, ili a Postavi s Usporednik - održavajte fiksni redoslijed, pa ih ni mi ne možemo promiješati.

Međutim, i dalje možemo nasumično pristupiti njihovim elementima pretvarajući ih prvo u Popis, zatim miješajući ovo Popis.

Pogledajmo brzi primjer miješanja elemenata a Karta:

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

Slično tome, možemo miješati elemente a Postavi:

Postavi učenika = novi HashSet (Arrays.asList ("Foo", "Bar", "Baz", "Qux")); Popis studentList = novi ArrayList (studenti); Collections.shuffle (studentList);

4. Zaključak

U ovom smo brzom vodiču vidjeli kako se koristi java.util.Collections.shuffle za miješanje raznih kolekcija na Javi.

To prirodno radi izravno s a Popis, a neizravno ga možemo koristiti za randomizaciju redoslijeda elemenata i u drugim zbirkama. Također možemo kontrolirati postupak miješanja pružajući prilagođeni izvor slučajnosti i učiniti ga determinističkim.

Kao i obično, sav kôd prikazan u ovom članku dostupan je na GitHubu.