Arrays.asList () возвращает список, который не допускает операций, влияющих на его размер (обратите внимание, что это не то же самое, что «неизменяемый»).
Вы могли бы сделать, new ArrayList<String>(Arrays.asList(split));
чтобы создать реальную копию, но, посмотрев, что вы пытаетесь сделать, вот дополнительное предложение (у вас есть O(n^2)
алгоритм прямо под этим).
Вы хотите удалить list.size() - count
(давайте назовем это k
) случайные элементы из списка. Просто выберите как можно больше случайных элементов и поменяйте их местами в конце k
списка, затем удалите весь этот диапазон (например, с помощью subList () и clear () для этого). Это превратит его в простой и средний O(n)
алгоритм ( O(k)
точнее).
Обновление : как отмечено ниже, этот алгоритм имеет смысл только в том случае, если элементы неупорядочены, например, если List представляет Bag. Если, с другой стороны, список имеет значимый порядок, этот алгоритм не будет его сохранять (вместо этого будет алгоритм полигенасыщенных смазок).
Обновление 2 : Итак, ретроспективно, лучший алгоритм (линейный, поддерживающий порядок, но с O (n) случайными числами) будет выглядеть примерно так:
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--;
}
}