Arrays.asList () restituisce un elenco che non consente operazioni che incidono sulle sue dimensioni (si noti che questo non è lo stesso di "non modificabile").
Potresti fare new ArrayList<String>(Arrays.asList(split));
per creare una copia reale, ma vedendo cosa stai cercando di fare, ecco un suggerimento aggiuntivo (hai un O(n^2)
algoritmo proprio sotto quello).
Vuoi rimuovere list.size() - count
(chiamiamolo così k
) elementi casuali dalla lista. Basta scegliere quanti più elementi casuali e scambiarli alle k
posizioni finali dell'elenco, quindi eliminare l'intero intervallo (ad esempio utilizzando subList () e clear () su quello). Ciò lo trasformerebbe in un O(n)
algoritmo snello e medio ( O(k)
è più preciso).
Aggiornamento : come indicato di seguito, questo algoritmo ha senso solo se gli elementi non sono ordinati, ad esempio se l'elenco rappresenta un sacchetto. Se, d'altra parte, l'Elenco ha un ordine significativo, questo algoritmo non lo preserverebbe (invece l'algoritmo dei poligenelubrificanti).
Aggiornamento 2 : Quindi in retrospettiva, un algoritmo migliore (lineare, di mantenimento, ma con numeri O (n) casuali) sarebbe qualcosa del genere:
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--;
}
}