Arrays.asList () devuelve una lista que no permite operaciones que afecten su tamaño (tenga en cuenta que esto no es lo mismo que "no modificable").
Podría hacer new ArrayList<String>(Arrays.asList(split));
para crear una copia real, pero viendo lo que está tratando de hacer, aquí hay una sugerencia adicional (tiene un O(n^2)
algoritmo justo debajo de eso).
Desea eliminar list.size() - count
(llamemos a esto k
) elementos aleatorios de la lista. Simplemente elija tantos elementos aleatorios y cámbielos a las k
posiciones finales de la lista, luego elimine todo ese rango (por ejemplo, usando subList () y clear () en eso). Eso lo convertiría en un O(n)
algoritmo magro y medio ( O(k)
es más preciso).
Actualización : como se indica a continuación, este algoritmo solo tiene sentido si los elementos no están ordenados, por ejemplo, si la Lista representa una Bolsa. Si, por otro lado, la Lista tiene un orden significativo, este algoritmo no lo preservaría (el algoritmo de los poligeneles lubricantes lo haría).
Actualización 2 : Entonces, en retrospectiva, un algoritmo mejor (lineal, manteniendo el orden, pero con números aleatorios O (n)) sería algo como esto:
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--;
}
}