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 k
vị 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--;
}
}