Arrays.asList () renvoie une liste qui ne permet pas les opérations affectant sa taille (notez que ce n'est pas la même chose que "non modifiable").
Vous pouvez faire new ArrayList<String>(Arrays.asList(split));
pour créer une copie réelle, mais en voyant ce que vous essayez de faire, voici une suggestion supplémentaire (vous avez un O(n^2)
algorithme juste en dessous).
Vous souhaitez supprimer list.size() - count
(appelons cela k
) des éléments aléatoires de la liste. Il suffit de sélectionner autant d'éléments aléatoires et de les échanger aux k
positions finales de la liste, puis de supprimer toute la plage (par exemple, en utilisant subList () et clear () à ce sujet). Cela le transformerait en un O(n)
algorithme maigre et moyen ( O(k)
est plus précis).
Mise à jour : Comme indiqué ci-dessous, cet algorithme n'a de sens que si les éléments ne sont pas ordonnés, par exemple si la liste représente un sac. Si, en revanche, la Liste a un ordre significatif, cet algorithme ne le conserverait pas (l'algorithme des polygénubrifiants le ferait à la place).
Mise à jour 2 : Donc, rétrospectivement, un meilleur algorithme (linéaire, maintenant l'ordre, mais avec des nombres aléatoires O (n)) ressemblerait à ceci:
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--;
}
}