Arrays.asList () mengembalikan daftar yang tidak memungkinkan operasi memengaruhi ukurannya (perhatikan bahwa ini tidak sama dengan "tidak dapat dimodifikasi").
Anda dapat melakukan new ArrayList<String>(Arrays.asList(split));
untuk membuat salinan nyata, tetapi melihat apa yang Anda coba lakukan, berikut ini adalah saran tambahan (Anda memiliki O(n^2)
algoritma tepat di bawahnya).
Anda ingin menghapus list.size() - count
(sebut ini k
) elemen acak dari daftar. k
Pilih saja elemen acak dan tukarkan dengan posisi akhir daftar, lalu hapus seluruh rentang itu (misalnya menggunakan subList () dan hapus () pada itu). Itu akan mengubahnya menjadi O(n)
algoritma ramping dan rata-rata ( O(k)
lebih tepat).
Pembaruan : Sebagaimana dicatat di bawah ini, algoritma ini hanya masuk akal jika elemen-elemennya tidak berurutan, misalnya jika Daftar tersebut mewakili Tas. Jika, di sisi lain, Daftar memiliki urutan yang berarti, algoritma ini tidak akan melestarikannya (algoritma polygenelubricants 'sebaliknya akan).
Pembaruan 2 : Jadi dalam retrospeksi, algoritma yang lebih baik (linier, mempertahankan urutan, tetapi dengan O (n) angka acak) akan menjadi seperti ini:
LinkedList<String> elements = ...; //to avoid the slow ArrayList.remove()
int k = elements.size() - count; //elements to select/delete
int remaining = elements.size(); //elements remaining to be iterated
for (Iterator i = elements.iterator(); k > 0 && i.hasNext(); remaining--) {
i.next();
if (random.nextInt(remaining) < k) {
//or (random.nextDouble() < (double)k/remaining)
i.remove();
k--;
}
}