Arrays.asList () zwraca listę, która nie zezwala na operacje wpływające na jej rozmiar (zwróć uwagę, że nie jest to to samo co „niemodyfikowalne”).
Możesz zrobić, new ArrayList<String>(Arrays.asList(split));
aby stworzyć prawdziwą kopię, ale widząc, co próbujesz zrobić, oto dodatkowa sugestia (maszO(n^2)
algorytm poniżej).
Chcesz usunąć list.size() - count
(nazwijmy to k
) losowe elementy z listy. Po prostu wybierz tyle losowych elementów i zamień je na końcowe k
pozycje listy, a następnie usuń cały zakres (np. Używając subList () i clear ()). To zmieniłoby go w uproszczony i średni O(n)
algorytm ( O(k)
jest bardziej precyzyjny).
Aktualizacja : Jak zauważono poniżej, ten algorytm ma sens tylko wtedy, gdy elementy są nieuporządkowane, np. Jeśli lista reprezentuje torbę. Z drugiej strony, jeśli lista ma znaczącą kolejność, algorytm nie zachowałby jej (zamiast tego algorytm wieloskładnikowy).
Aktualizacja 2 : Z perspektywy czasu lepszy (liniowy, zachowujący porządek, ale z liczbami losowymi O (n)) byłby mniej więcej taki:
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--;
}
}