ฉันงุนงงที่ไม่สามารถหาคำตอบได้อย่างรวดเร็วสำหรับเรื่องนี้ ฉันกำลังมองหาโครงสร้างข้อมูลใน Java ซึ่งใช้java.util.List
อินเทอร์เฟซเป็นหลัก แต่จะจัดเก็บสมาชิกในลำดับที่เรียงลำดับ ฉันรู้ว่าคุณสามารถใช้แบบปกติArrayList
และCollections.sort()
ใช้ได้ แต่ฉันมีสถานการณ์ที่ฉันเพิ่มและดึงข้อมูลสมาชิกจากรายการของฉันเป็นครั้งคราวและฉันไม่ต้องการเรียงลำดับทุกครั้งที่ดึงข้อมูลสมาชิกในกรณีที่ เพิ่มอันใหม่แล้ว ใครช่วยชี้ให้ฉันเห็นสิ่งที่มีอยู่ใน JDK หรือแม้แต่ห้องสมุดบุคคลที่สาม
แก้ไข : โครงสร้างข้อมูลจะต้องเก็บข้อมูลที่ซ้ำกัน
สรุปคำตอบ : ฉันพบว่าทั้งหมดนี้น่าสนใจมากและได้เรียนรู้มากมาย โดยเฉพาะอย่างยิ่ง Aioobe สมควรได้รับการกล่าวถึงสำหรับความอุตสาหะของเขาในการพยายามบรรลุข้อกำหนดของฉันข้างต้น (ส่วนใหญ่เป็นการใช้งาน java.util.List ที่เรียงลำดับซึ่งรองรับรายการที่ซ้ำกัน) ฉันยอมรับว่าคำตอบของเขาถูกต้องที่สุดสำหรับสิ่งที่ฉันถามและความคิดส่วนใหญ่ที่กระตุ้นให้เกิดผลกระทบของสิ่งที่ฉันกำลังมองหาแม้ว่าสิ่งที่ฉันถามจะไม่ใช่สิ่งที่ฉันต้องการก็ตาม
ปัญหาเกี่ยวกับสิ่งที่ฉันขออยู่ในอินเทอร์เฟซรายการและแนวคิดของวิธีการเสริมในอินเทอร์เฟซ หากต้องการอ้างอิง javadoc:
ผู้ใช้อินเทอร์เฟซนี้สามารถควบคุมได้อย่างแม่นยำว่าจะแทรกองค์ประกอบใดในรายการ
การแทรกลงในรายการที่เรียงลำดับไม่สามารถควบคุมจุดแทรกได้อย่างแม่นยำ จากนั้นคุณต้องคิดว่าคุณจะจัดการกับวิธีการบางอย่างอย่างไร ใช้add
ตัวอย่างเช่น:
เพิ่มบูลีนสาธารณะ (Object o)
Appends the specified element to the end of this list (optional operation).
ตอนนี้คุณถูกทิ้งให้อยู่ในสถานการณ์ที่ไม่สบายใจของ 1) การทำลายสัญญาและใช้การเพิ่มเวอร์ชันที่เรียงลำดับ 2) การปล่อยให้add
เพิ่มองค์ประกอบในตอนท้ายของรายการทำลายลำดับที่จัดเรียงของคุณ 3) ออกadd
จาก (เป็นทางเลือก) โดยการขว้างปาUnsupportedOperationException
และการใช้วิธีการที่จะเพิ่มรายการในลำดับที่เรียงลำดับอื่น
ตัวเลือก 3 น่าจะดีที่สุด แต่ฉันพบว่ามันไม่น่าพอใจที่มีวิธีการเพิ่มที่คุณใช้ไม่ได้และวิธีการเรียงลำดับอื่นที่ไม่ได้อยู่ในอินเทอร์เฟซ
โซลูชันอื่น ๆ ที่เกี่ยวข้อง (ไม่เรียงตามลำดับ):
- java.util.PriorityQueueซึ่งอาจใกล้เคียงกับสิ่งที่ฉันต้องการมากกว่าที่ฉันขอ คิวไม่ใช่คำจำกัดความที่แม่นยำที่สุดของคอลเลกชันของออบเจ็กต์ในกรณีของฉัน แต่มันทำงานได้ทุกอย่างที่ฉันต้องการ
- net.sourceforge.nite.util.SortedList อย่างไรก็ตามการดำเนินงานนี้แบ่งสัญญาของอินเตอร์เฟซรายการโดยการใช้การเรียงลำดับในส่วนวิธีการและพิกลมีวิธีไม่มีผลกระทบ
add(Object obj)
add(int index, Object obj)
ฉันทามติทั่วไปที่แนะนำthrow new UnsupportedOperationException()
อาจเป็นทางเลือกที่ดีกว่าในสถานการณ์นี้ - TreeMultiSet ของฝรั่งการใช้งานชุดที่รองรับการทำซ้ำ
- ca.odell.glazedlists.SortedList คลาสนี้มาพร้อมกับข้อแม้ใน javadoc:
Warning: This class breaks the contract required by List