ลบ () ในรายการที่สร้างโดย Arrays.asList () พ่น UnsupportedOperationException


92

ฉันมีคอลเลกชันและอาร์เรย์c1<MyClass> a<MyClass>ฉันพยายามที่จะแปลงอาร์เรย์เพื่อเก็บรวบรวมc2และทำแต่นี้พ่นc1.removeAll(c2) UnsupportedOperationExceptionฉันพบว่าasList()คลาส of Arrays ส่งคืนArrays.ArrayListคลาสและคลาสนี้สืบทอดremoveAll()มาจากAbstractList()การใช้งานที่พ่นUnsupportedOperationExceptionออกมา

    Myclass la[] = getMyClass();
    Collection c = Arrays.asList(la);
    c.removeAll(thisAllreadyExistingMyClass);

มีวิธีใดในการลบองค์ประกอบหรือไม่? กรุณาช่วย


คำถามที่เกี่ยวข้อง: stackoverflow.com/questions/2965747/…
ราม

คำตอบ:


174

Arrays.asListส่งคืนListwrapper รอบ ๆ อาร์เรย์ เสื้อคลุมนี้มีขนาดคงที่และได้รับการสนับสนุนโดยตรงจากอาร์เรย์และเนื่องจากการเรียกดังกล่าวsetจะแก้ไขอาร์เรย์และวิธีการอื่นใดที่แก้ไขรายการจะทำให้UnsupportedOperationExceptionไฟล์.

ในการแก้ไขปัญหานี้คุณต้องสร้างรายการที่แก้ไขได้ใหม่โดยการคัดลอกเนื้อหาของรายการกระดาษห่อหุ้ม สิ่งนี้ทำได้ง่ายโดยใช้ตัวArrayListสร้างที่รับCollection:

Collection c = new ArrayList(Arrays.asList(la));

1
ฉันกำลังดูซอร์สโค้ดสำหรับjava.util.Arrays asList()วิธีการและดูเหมือนว่าจะส่งคืนArrayListไฟล์. แต่เมื่อฉันทำฉันได้รับSystem.out.println(list.getClass()); class java.util.Arrays$ArrayListดังนั้นมันจึงใช้ArrayListคลาสภายในซึ่งไม่มี a addหรือremoveวิธีการ ฉันแค่สงสัยว่าอะไรคือจุดที่มีArrayListคลาสชั้นในแทนที่จะใช้คลาสjava.util.ArrayListและทำไมไม่มีadd()และremove()วิธีการ?
อับดุล

การแก้ไขความคิดเห็นข้างต้นของฉันมันมีaddและremoveวิธีการ
อับดุล

1
@Abdul java.util.ArrayListเพราะไม่มีสิ่งดังกล่าวเป็นขนาดคงที่ คุณต้องการให้มีการใช้งานListดังกล่าวจะทำให้เกิดข้อยกเว้นหากคุณทำสิ่งที่ผิดกฎหมาย (เช่นการเพิ่มหรือลบ) และArrayListไม่เป็นไปตามข้อกำหนดนั้น
Etienne de Martel

@Abdul เพียงสร้างเสื้อคลุมArrays.asList Listแต่มันยังคงเป็นjava.util.Listดังนั้นมันต้องมีวิธีการเหล่านั้น แต่ไม่สามารถใช้งานได้เนื่องจากจะนำไปสู่การสร้างอาร์เรย์ใหม่ที่มีขนาดแตกต่างกัน ซึ่งไม่สามารถทำได้เนื่องจากการปรับเปลี่ยนที่คุณยังทำได้สามารถทำได้ทั้งผ่านรายการที่ส่งคืนและอาร์เรย์เดิม สิ่งนี้จะเป็นไปไม่ได้หากรายการที่ส่งคืนสามารถเปลี่ยนแปลงได้ดังนั้นโดยทั่วไปจะทิ้งการอ้างอิงอาร์เรย์เดิม
Adam Hošek

13

ใช่Arrays.asList(..)คอลเลกชันที่ไม่สามารถขยายหรือหดได้ (เนื่องจากได้รับการสนับสนุนโดยอาร์เรย์เดิมและไม่สามารถปรับขนาดได้)

หากคุณต้องการลบองค์ประกอบให้สร้างnew ArrayList(Arrays.asList(..)หรือลบองค์ประกอบโดยตรงจากอาร์เรย์ (ซึ่งจะมีประสิทธิภาพน้อยกว่าและเขียนยากกว่า)


+1 คำตอบนี้เป็นคำตอบเดียวที่ถูกต้อง: Arrays.asList () ส่งคืนรายการที่ไม่สามารถแก้ไขได้นั่นคือสิ่งที่ทำให้เกิดข้อยกเว้น ไม่มีอะไรเกี่ยวข้องกับการ "สนับสนุนโดยอาร์เรย์" ฯลฯ ... ArrayLists ทั้งหมดได้รับการสนับสนุนจากอาร์เรย์ - เรื่องใหญ่
โบฮีเมียน

1
แต่ถ้าคุณอ่านเพิ่มเติมในเอกสารคุณจะรู้ว่ามันไม่สามารถแก้ไขไม่ได้จริงๆ ... "ส่งคืนรายการขนาดคงที่ที่สำรองโดยอาร์เรย์ที่ระบุ (การเปลี่ยนแปลงรายการที่ส่งคืน" เขียนผ่าน "ไปยังอาร์เรย์ .) "-1 เอเตียนค่อนข้างถูกต้อง
Steven Schlansker

1
@Steven ใช่นั่นคือเหตุผลที่ระบุว่า "ขนาดคงที่" แทนที่จะเป็น "ไม่สามารถแก้ไขได้" หรือ "อ่านอย่างเดียว" อันที่จริงฉันจะแก้ไขคำตอบของฉันทันทีเพื่อสะท้อนให้เห็นว่า
Etienne de Martel

1
@ โบฮีเมียนคอลเลกชันที่ส่งคืนนั้นไม่มีความชัดเจน 'แก้ไขได้' เนื่องจากสามารถเรียกเมธอด 'set' ได้
javalearner

2
หากคุณจะเลือก nits แบบนั้นคุณอาจพูดว่า vapid เช่น "มันพ่น UnsupportedOperationException เนื่องจากมีคำสั่ง Throw UnsupportedOperationException ในโค้ด" ผู้บริโภค API ไม่สนใจว่าคลาสซูเปอร์คลาสของ AbstractBlah ตัวใดจะทิ้งข้อยกเว้นพวกเขาสนใจว่าสัญญาและความคาดหวังของคลาสที่พวกเขาใช้คืออะไร ใน JVM v + 1 เป็นไปได้ทั้งหมดที่ไลบรารีคลาสจะเปลี่ยนแปลงเมื่อเกิดข้อยกเว้น - แต่สัญญาจะไม่เปลี่ยนแปลง
Steven Schlansker

7

นั่นคือวิธีการArray.asList()ทำงานเนื่องจากได้รับการสนับสนุนโดยตรงจากอาร์เรย์ หากต้องการรับรายการที่แก้ไขได้ทั้งหมดคุณจะต้องโคลนคอลเล็กชันลงในคอลเล็กชันที่สร้างขึ้นด้วยตัวเอง

Collection c = new ArrayList(Arrays.asList(la))

1
รายการนี้สามารถแก้ไขได้ แต่ผ่าน set () เท่านั้น คอลเลกชันที่ส่งคืนมีขนาดคงที่
javalearner

ฉันไม่เคยบอกว่ามันแก้ไขไม่ได้จริงๆ เพียงแค่นั้นเพื่อให้ได้รายการที่แก้ไขได้ (เต็ม) คุณจะต้องใช้ArrayListไฟล์. ความแตกต่างอาจไม่ชัดเจนเกินไป :-) ไม่ว่ารายการจะแก้ไขได้หรือไม่เป็นคำถามเกี่ยวกับคำจำกัดความมันเป็น "กึ่งแก้ไขได้" แต่ไม่สามารถแก้ไขได้ทั้งหมดในมุมมองของฉัน
henko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.