Rumah > Soal Jawab > teks badan
大家讲道理2017-04-18 10:09:02
for (int i=size; i>1; i--)
swap(list, i-1, rnd.nextInt(i));
shuffle
mengacak susunan senarai, menggunakan Random
untuk menjana indeks (nombor rawak) dan menukar elemen i-1
dengan indeks rawak. Gelung collection.size()
kali.
PHP中文网2017-04-18 10:09:02
Untuk masalah seperti ini, lihat sahaja kod sumber.
@SuppressWarnings({"rawtypes", "unchecked"})
public static void shuffle(List<?> list, Random rnd) {
int size = list.size();
if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
for (int i=size; i>1; i--)
swap(list, i-1, rnd.nextInt(i));
} else {
Object arr[] = list.toArray();
// Shuffle array
for (int i=size; i>1; i--)
swap(arr, i-1, rnd.nextInt(i));
ListIterator it = list.listIterator();
for (int i=0; i<arr.length; i++) {
it.next();
it.set(arr[i]);
}
}
}
Di atas ialah kod sumber JDK Kaedah terasnya ialah shuffle
, dengan beberapa ulasan dialih keluar.
Pertama-tama dapatkan bilangan elemen dalam set Jika kurang daripada 5 atau melaksanakan antara muka RandomAccess
, ia akan menggelung semula dan secara rawak menukar kedudukan dua elemen bersebelahan dalam set antara muka Jika ia dilaksanakan Mempunyai antara muka ini bermakna menyokong operasi capaian rawak pantas, sama seperti tatasusunan. RandomAccess
tidak dilaksanakan, maka ia akan ditukar kepada tatasusunan, dan kemudian ia juga akan gelung, menukar kedudukan dua elemen bersebelahan secara rawak dalam set , dan akhirnya meletakkan tatasusunan kembali kepada asal RandomAccess
Sederhana. list
大家讲道理2017-04-18 10:09:02
Ia adalah "anggaran" shuffle koleksi secara rawak Prinsipnya sangat mudah ia berdasarkan penjana nombor rawak dan berinteraksi secara rawak dengan susunan unsur koleksi.