Arrays.asList () gibt eine Liste zurück, die keine Operationen zulässt, die sich auf die Größe auswirken (beachten Sie, dass dies nicht mit "nicht modifizierbar" identisch ist).
Sie können new ArrayList<String>(Arrays.asList(split));
eine echte Kopie erstellen, aber wenn Sie sehen, was Sie tun möchten, finden Sie hier einen zusätzlichen Vorschlag (Sie haben eineO(n^2)
Algorithmus direkt darunter).
Sie möchten zufällige Elemente aus der Liste entfernen list.size() - count
(nennen wir dies k
). k
Wählen Sie einfach so viele zufällige Elemente aus und tauschen Sie sie an die Endpositionen der Liste aus. Löschen Sie dann den gesamten Bereich (z. B. mit subList () und clear ()). Das würde es zu einem schlanken und mittleren O(n)
Algorithmus machen ( O(k)
ist genauer).
Update : Wie unten erwähnt, ist dieser Algorithmus nur dann sinnvoll, wenn die Elemente ungeordnet sind, z. B. wenn die Liste eine Tasche darstellt. Wenn andererseits die Liste eine aussagekräftige Reihenfolge hat, würde dieser Algorithmus diese nicht beibehalten (der Algorithmus der Polygenschmierstoffe würde dies stattdessen tun).
Update 2 : Rückblickend wäre ein besserer Algorithmus (linear, Beibehaltung der Reihenfolge, aber mit O (n) Zufallszahlen) ungefähr so:
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--;
}
}