Arrays.asList () ส่งคืนรายการที่ไม่อนุญาตการดำเนินการที่ส่งผลกระทบต่อขนาด (โปรดทราบว่านี่ไม่เหมือนกับ "unmodifiable")
คุณสามารถทำได้new ArrayList<String>(Arrays.asList(split));
เพื่อสร้างสำเนาจริง แต่เห็นสิ่งที่คุณพยายามทำนี่คือคำแนะนำเพิ่มเติม (คุณมีO(n^2)
อัลกอริทึมด้านล่าง)
คุณต้องการลบองค์ประกอบแบบสุ่มlist.size() - count
(เรียกว่านี้k
) จากรายการ เพียงแค่เลือกองค์ประกอบสุ่มจำนวนมากและสลับไปยังk
ตำแหน่งสุดท้ายของรายการจากนั้นลบช่วงทั้งหมดนั้น (เช่นใช้ subList () และ clear () ในนั้น) นั่นจะทำให้มันกลายเป็นO(n)
อัลกอรึทึมและค่าเฉลี่ย( O(k)
แม่นยำยิ่งขึ้น)
อัปเดต : ดังที่ระบุไว้ด้านล่างอัลกอริธึมนี้เหมาะสมถ้าองค์ประกอบไม่ได้จัดเรียงเช่นถ้ารายการแสดงถึงกระเป๋า หากในอีกทางหนึ่งรายการมีลำดับที่มีความหมายอัลกอริทึมนี้จะไม่เก็บไว้ (อัลกอริทึมของ polygenelubricants แทนจะ)
อัปเดต 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--;
}
}