Arrays.asList () trả về một danh sách không cho phép các hoạt động ảnh hưởng đến kích thước của nó (lưu ý rằng đây không giống như "không thể thay đổi").
Bạn có thể làm new ArrayList<String>(Arrays.asList(split));để tạo một bản sao thực sự, nhưng xem những gì bạn đang cố gắng làm, đây là một gợi ý bổ sung (bạn có mộtO(n^2) thuật toán ngay bên dưới đó).
Bạn muốn loại bỏ list.size() - count(hãy gọi đây k) các yếu tố ngẫu nhiên khỏi danh sách. Chỉ cần chọn càng nhiều phần tử ngẫu nhiên và hoán đổi chúng vào kvị trí cuối của danh sách, sau đó xóa toàn bộ phạm vi đó (ví dụ: sử dụng subList () và clear () trên đó). Điều đó sẽ biến nó thành một O(n)thuật toán nạc và trung bình (O(k) chính xác hơn).
Cập nhật : Như đã lưu ý dưới đây, thuật toán này chỉ có ý nghĩa nếu các yếu tố không được sắp xếp, ví dụ: nếu Danh sách đại diện cho một Túi. Mặt khác, nếu Danh sách có một thứ tự có ý nghĩa, thuật toán này sẽ không bảo tồn nó (thay vào đó là thuật toán của đa gen).
Cập nhật 2 : Vì vậy, khi nhìn lại, một thuật toán tốt hơn (tuyến tính, duy trì trật tự, nhưng với thuật toán số ngẫu nhiên O (n) sẽ giống như thế này:
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--;
}
}