Arrays.asList () retorna uma lista que não permite operações que afetam seu tamanho (observe que isso não é o mesmo que "não modificável").
Você pode fazer new ArrayList<String>(Arrays.asList(split));
para criar uma cópia real, mas vendo o que você está tentando fazer, aqui está uma sugestão adicional (você tem um O(n^2)
algoritmo logo abaixo).
Você deseja remover list.size() - count
(vamos chamar isso k
) elementos aleatórios da lista. Basta escolher o maior número de elementos aleatórios e trocá-los para as k
posições finais da lista e excluir todo o intervalo (por exemplo, usando subList () e clear () nele). Isso o tornaria um O(n)
algoritmo enxuto e médio ( O(k)
é mais preciso).
Atualização : Conforme observado abaixo, esse algoritmo só faz sentido se os elementos não estiverem ordenados, por exemplo, se a Lista representar um Saco. Se, por outro lado, a Lista tiver uma ordem significativa, esse algoritmo não a preservará (o algoritmo dos pologenelubricantes, em vez disso).
Atualização 2 : Então, retrospectivamente, um algoritmo melhor (linear, mantendo a ordem, mas com O (n) números aleatórios)) seria algo como isto:
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--;
}
}