Mengacak Koleksi Di Java

1. Ikhtisar

Dalam artikel singkat ini, kita akan melihat bagaimana kita dapat mengacak koleksi di Java . Java memiliki metode bawaan untuk mengacak objek List - kami juga akan menggunakannya untuk koleksi lain.

2. Mengocok Daftar

Kami akan menggunakan metode java.util.Collections.shuffle , yang menerima masukan Daftar dan mengocoknya di tempat. Yang kami maksud dengan in-place adalah mengacak daftar yang sama seperti yang diteruskan dalam masukan alih-alih membuat yang baru dengan elemen yang diacak.

Mari kita lihat contoh singkat yang menunjukkan cara mengacak Daftar :

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

Ada versi kedua dari java.util.Collections.shuffle yang juga menerima masukan sumber keacakan khusus. Ini dapat digunakan untuk menjadikan pengocokan sebagai proses deterministik jika kita memiliki persyaratan seperti itu untuk aplikasi kita.

Mari gunakan varian kedua ini untuk mencapai pengacakan yang sama pada dua daftar:

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

Saat menggunakan sumber keacakan yang identik (diinisialisasi dari nilai benih yang sama), urutan nomor acak yang dihasilkan akan sama untuk kedua pengacakan. Jadi, setelah mengacak, kedua daftar akan berisi elemen dengan urutan yang sama persis.

3. Mengacak Elemen Koleksi Tidak Beraturan

Kami mungkin ingin mengacak koleksi lain juga seperti Set, Peta, atau Antrean , misalnya, tetapi semua koleksi ini tidak berurutan - mereka tidak mempertahankan urutan tertentu.

Beberapa implementasi, seperti LinkedHashMap , atau Set with a Comparator - mempertahankan urutan tetap, sehingga kami juga tidak dapat mengacaknya.

Namun, kita masih dapat mengakses elemennya secara acak dengan mengonversinya terlebih dahulu menjadi Daftar , lalu mengacak Daftar ini .

Mari kita lihat contoh cepat mengacak elemen Peta :

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

Demikian pula, kita bisa mengacak elemen Set :

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

4. Kesimpulan

Dalam tutorial singkat ini, kami melihat cara menggunakan java.util.Collections.shuffle untuk mengacak berbagai koleksi di Java.

Ini secara alami bekerja secara langsung dengan List, dan kita dapat menggunakannya secara tidak langsung untuk mengacak urutan elemen dalam koleksi lain juga. Kami juga dapat mengontrol proses pengacakan dengan menyediakan sumber keacakan khusus dan menjadikannya deterministik.

Seperti biasa, semua kode yang ditunjukkan dalam artikel ini tersedia di GitHub.