Arrays.asList (), boyutunu etkileyen işlemlere izin vermeyen bir liste döndürür (bunun "değiştirilemez" ile aynı olmadığını unutmayın).
new ArrayList<String>(Arrays.asList(split));
Gerçek bir kopya oluşturmak için yapabilirsiniz , ancak ne yapmaya çalıştığınızı görmek, burada ek bir öneri ( O(n^2)
hemen altında bir algoritmanız var).
Rastgele öğeleri listeden kaldırmak istiyorsunuz list.size() - count
(buna diyelim k
). Sadece rastgele sayıda öğe seçin ve bunları k
listenin son konumlarına değiştirin , ardından tüm aralığı silin (örn. SubList () kullanarak ve bunun üzerinde clear ()). Bu onu yalın ve ortalama bir O(n)
algoritmaya dönüştürür ( O(k)
daha kesin).
Güncelleme : Aşağıda belirtildiği gibi, bu algoritma sadece elemanlar sıralanmamışsa, örneğin Liste bir Torbayı temsil ediyorsa mantıklıdır. Öte yandan, Liste anlamlı bir sıraya sahipse, bu algoritma onu korumaz (bunun yerine poligenel yağlayıcıların algoritması).
Güncelleme 2 : Geriye dönüp bakıldığında, daha iyi (doğrusal, sürdürme sırası, ancak O (n) rastgele sayılarla) algoritması şöyle bir şey olurdu:
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--;
}
}