Arrays.asList () повертає список, який не дозволяє операціям, що впливають на його розмір (зауважте, що це не те саме, що "немодифікується").
Можна new ArrayList<String>(Arrays.asList(split));
створити справжню копію, але побачивши, що ви намагаєтеся зробити, ось додаткова пропозиція (у вас є O(n^2)
алгоритм прямо під цим).
Ви хочете видалити list.size() - count
(дозволить назвати це k
) випадкові елементи зі списку. Просто виберіть стільки випадкових елементів і поміняйте їх на кінцеві k
позиції списку, а потім видаліть цілий діапазон (наприклад, використовуючи subList () та очистіть () на цьому). Це перетворило б його на негідний і середній O(n)
алгоритм ( O(k)
точніше).
Оновлення : Як зазначено нижче, цей алгоритм має сенс лише в тому випадку, якщо елементи не упорядковані, наприклад, якщо Список представляє Мішок. Якщо, з іншого боку, Список має змістовний порядок, цей алгоритм не зберігатиме його (натомість алгоритм полігеномастичних матеріалів).
Оновлення 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--;
}
}