Mengacak Koleksi Di Jawa

1. Gambaran keseluruhan

Dalam artikel ringkas ini, kita akan melihat bagaimana kita dapat mengombak koleksi di Java . Java mempunyai kaedah bawaan untuk mengacak objek Senarai - kami akan menggunakannya untuk koleksi lain juga.

2. Mengubah senarai

Kami akan menggunakan kaedah java.util.Collections.shuffle , yang mengambil sebagai input Daftar dan menggesernya di tempat. Di tempat, kami bermaksud bahawa ia mengubah senarai yang sama seperti yang dimasukkan dalam input dan bukannya membuat yang baru dengan elemen yang diacak.

Mari lihat contoh ringkas yang menunjukkan cara mengubah Daftar :

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

Terdapat versi kedua java.util.Collections.shuffle yang juga diterima sebagai input sumber kebiasaan tersuai. Ini dapat digunakan untuk membuat pengacakan proses deterministik jika kita memiliki syarat seperti itu untuk aplikasi kita.

Mari gunakan varian kedua ini untuk mencapai perubahan yang sama pada dua senarai:

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

Apabila menggunakan sumber rawak yang sama (diinisialisasi dari nilai biji yang sama), urutan nombor rawak yang dihasilkan akan sama untuk kedua-dua shuffle. Oleh itu, setelah mengacak, kedua-dua senarai akan mengandungi unsur dalam urutan yang sama.

3. Mengacak Elemen Koleksi Tidak Beratur

Kami mungkin ingin mengubah koleksi lain seperti Set, Peta, atau Antrian , misalnya, tetapi semua koleksi ini tidak disusun - mereka tidak mengekalkan pesanan tertentu.

Beberapa implementasi, seperti LinkedHashMap , atau Set dengan Comparator - memang mengekalkan susunan tetap, sehingga kami juga tidak dapat mengacaknya.

Walau bagaimanapun, kita masih boleh mengakses unsur-unsur mereka secara rawak dengan menukar mereka pertama ke dalam Senarai , kemudian shuffling ini List .

Mari kita lihat contoh ringkas 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());
    

Begitu juga, kita dapat mengubah elemen Set :

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

4. Kesimpulan

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

Ini secara semula jadi berfungsi secara langsung dengan Senarai, dan kita dapat menggunakannya secara tidak langsung untuk mengacak susunan elemen dalam koleksi lain juga. Kami juga dapat mengendalikan proses pengacakan dengan memberikan sumber kebiasaan khusus dan menjadikannya deterministik.

Seperti biasa, semua kod yang ditunjukkan dalam artikel ini terdapat di GitHub.