Saya sedang menulis program untuk beberapa perangkat lunak kuis. Saya memiliki kelas pertanyaan yang berisi ArrayLists untuk pertanyaan, jawaban, opsi, tanda dan tanda negatif. Sesuatu seperti ini:
class question
{
private ArrayList<Integer> index_list;
private ArrayList<String> question_list;
private ArrayList<String> answer_list;
private ArrayList<String> opt1_list;
private ArrayList<String> opt2_list;
}
Saya ingin mengocok semua pertanyaan, tetapi agar pertanyaan dikocok, semua objek harus dikocok. Saya akan mendekati masalah ini dengan cara ini:
Pertama-tama, saya tidak akan menggunakan desain ini dan menggunakan String tidak ArrayList<String>
mengetik sebagai variabel instan, dan kemudian akan menggunakan Collections.shuffle
metode untuk mengocok objek. Tapi tim saya bersikeras desain ini.
Sekarang, kelas pertanyaan berisi ArrayLists yang semakin meningkat saat entri ke pertanyaan dibuat. Bagaimana cara mengocok pertanyaan sekarang?
java
collections
pengguna1369975
sumber
sumber
Jawaban:
Tim Anda menderita masalah umum: penolakan objek .
Alih-alih kelas yang menyimpan satu pertanyaan dengan semua informasi yang terkait dengannya, Anda mencoba membuat kelas yang disebut
question
yang menampung semua pertanyaan dalam satu contoh.Itu cara yang salah untuk melakukannya, dan itu menyulitkan apa yang Anda coba lakukan banyak ! Mengurutkan (dan mengacak) array paralel (atau Daftar) adalah bisnis yang tidak menyenangkan dan tidak ada API umum untuk itu, hanya karena Anda biasanya ingin menghindarinya sama sekali .
Saya sarankan Anda menyusun ulang kode Anda seperti ini:
Dengan cara ini, mengocok pertanyaan Anda menjadi sepele (menggunakan
Collections.shuffle()
):sumber
Kamu tidak. Anda membuat daftar / antrian indeks lain dan mengacaknya. Kemudian Anda mengulangi indeks yang mendorong urutan "mengacak" koleksi Anda yang lain.
Bahkan di luar skenario Anda dengan hal-hal yang terpisah, koleksi pemesanan terpisah memberikan sejumlah manfaat (paralelisme, kecepatan ketika mengulang koleksi asli mahal, dll).
sumber
Saya setuju dengan jawaban lain bahwa solusi yang benar adalah dengan menggunakan model objek yang tepat.
Namun, sebenarnya cukup mudah untuk mengacak beberapa daftar dengan cara yang sama:
sumber
Buat kelas
Question2
:Kemudian buat pemetaan fungsi a
question
untukArrayList<Question2>
, gunakanCollection.Shuffle
untuk hasil itu, dan buat fungsi kedua untuk pemetaanArrayList<Question2>
kembali kequestion
.Setelah itu, pergi ke tim Anda dan cobalah meyakinkan mereka bahwa menggunakan
ArrayList<Question2>
alih - alihquestion
akan meningkatkan banyak kode mereka, karena itu akan menghemat banyak konversi yang tidak perlu.sumber
Jawaban naif dan salah saya yang asli :
Memperbarui:
Terima kasih untuk the_lotus karena menunjukkan artikel horor pengkodean. Saya merasa jauh lebih pintar sekarang :-) Pokoknya Jeff Atwood juga menunjukkan cara melakukannya dengan benar, menggunakan algoritma Fisher-Yates :
Perbedaan utama di sini adalah bahwa setiap elemen hanya ditukar sekali.
Dan sementara jawaban lain dengan benar menjelaskan bahwa model objek Anda cacat, Anda mungkin tidak berada dalam posisi untuk mengubahnya. Jadi algoritma Fisher-Yates akan menyelesaikan masalah Anda tanpa mengubah model data Anda.
sumber