ชุด Java เก็บคำสั่งซื้อหรือไม่? วิธีหนึ่งคืนชุดให้ฉันและคาดว่าข้อมูลจะได้รับคำสั่ง แต่วนซ้ำกับชุดข้อมูลจะไม่มีการเรียงลำดับ มีวิธีที่ดีกว่าในการจัดการสิ่งนี้หรือไม่? จำเป็นต้องเปลี่ยนวิธีการเพื่อส่งคืนสิ่งอื่นที่ไม่ใช่ชุดหรือไม่
ชุด Java เก็บคำสั่งซื้อหรือไม่? วิธีหนึ่งคืนชุดให้ฉันและคาดว่าข้อมูลจะได้รับคำสั่ง แต่วนซ้ำกับชุดข้อมูลจะไม่มีการเรียงลำดับ มีวิธีที่ดีกว่าในการจัดการสิ่งนี้หรือไม่? จำเป็นต้องเปลี่ยนวิธีการเพื่อส่งคืนสิ่งอื่นที่ไม่ใช่ชุดหรือไม่
คำตอบ:
Set
อินเตอร์เฟซที่ไม่ได้ให้การค้ำประกันการสั่งซื้อใด ๆ
อินเตอร์เฟสย่อยของมันSortedSet
หมายถึงชุดที่เรียงลำดับตามเกณฑ์บางอย่าง ใน Java 6 SortedSet
มีสองมาตรฐานภาชนะที่ใช้ พวกเขาเป็นและTreeSet
ConcurrentSkipListSet
นอกจากSortedSet
อินเตอร์เฟสแล้วยังมีLinkedHashSet
คลาสอีกด้วย มันจะจำลำดับที่องค์ประกอบถูกแทรกเข้าไปในชุดและส่งกลับองค์ประกอบในลำดับที่
LinkedHashSetเป็นสิ่งที่คุณต้องการ
List
ไม่ใช่Set
(ไม่รับประกันความเป็นสมาชิกที่ไม่เหมือนใคร)
สมาชิกหลายคนแนะนำให้ใช้LinkedHashSetเพื่อรักษาลำดับของการรวบรวม คุณสามารถห่อชุดของคุณโดยใช้การดำเนินการนี้
SortedSetการดำเนินการสามารถใช้สำหรับการเรียงลำดับ แต่สำหรับการใช้งานวัตถุประสงค์ของคุณLinkedHashSet
นอกจากนี้จากเอกสาร
"การติดตั้งนี้ทำให้ลูกค้าไม่ได้รับการสั่งซื้อที่ไม่เป็นระเบียบโดยทั่วไปมีการสั่งซื้อที่ยุ่งเหยิงโดย HashSet โดยไม่มีค่าใช้จ่ายเพิ่มขึ้นที่เกี่ยวข้องกับ TreeSet ซึ่งสามารถใช้สร้างสำเนาของชุดที่มีคำสั่งเดียวกับต้นฉบับโดยไม่คำนึงถึงต้นฉบับ การใช้งานของชุด: "
ที่มา: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
Set เป็นเพียงส่วนต่อประสาน ในการรักษาคำสั่งซื้อคุณต้องใช้การใช้งานเฉพาะของอินเทอร์เฟซนั้นและอินเทอร์เฟซย่อย SortedSet ตัวอย่างเช่น TreeSet หรือ LinkedHashSet คุณสามารถห่อ Set ด้วยวิธีนี้:
Set myOrderedSet = new LinkedHashSet(mySet);
นี่เป็นบทสรุปโดยย่อเกี่ยวกับลักษณะการสั่งซื้อของการSet
ใช้งานมาตรฐานที่มีอยู่ใน Java:
สำหรับกรณีเฉพาะของคุณคุณสามารถเรียงลำดับรายการก่อนจากนั้นใช้รายการใดก็ได้ 1 หรือ 2 (เป็นไปได้มากที่สุดLinkedHashSet
หรือTreeSet
) หรืออีกวิธีหนึ่งและมีประสิทธิภาพมากขึ้นคุณสามารถเพิ่มข้อมูลที่ไม่เรียงลำดับTreeSet
ซึ่งจะจัดการการเรียงลำดับให้คุณโดยอัตโนมัติ
เพื่อรักษาการใช้คำสั่งหรือList
LinkedHashSet
LinkedHashSet
ไม่ได้ Map
...
LinkedHashSet เป็น HashSet เวอร์ชันที่สั่งซื้อซึ่งจะรักษารายการที่เชื่อมโยงเป็นสองเท่าในองค์ประกอบทั้งหมด ใช้คลาสนี้แทน HashSet เมื่อคุณใส่ใจกับคำสั่งวนซ้ำ
จาก javadoc สำหรับSet.iterator()
:
ส่งคืนตัววนซ้ำกับองค์ประกอบในชุดนี้ องค์ประกอบจะถูกส่งกลับในลำดับที่ไม่มี (ยกเว้นชุดนี้เป็นตัวอย่างของคลาสที่ให้การรับประกัน)
และตามที่ระบุไว้แล้วโดยshuuchan , a TreeSet
คือการดำเนินการของSet
ที่มีคำสั่งรับประกัน:
องค์ประกอบจะถูกจัดเรียงโดยใช้การจัดเรียงตามธรรมชาติหรือโดย Comparator ที่มีให้ ณ เวลาการสร้างที่กำหนด
โดยปกติการตั้งค่าจะไม่รักษาคำสั่งซื้อเช่น HashSet เพื่อค้นหา emelent อย่างรวดเร็ว แต่คุณสามารถลองใช้ LinkedHashSet ได้ซึ่งจะเป็นการรักษาลำดับที่คุณใส่ไว้
มี 2 สิ่งที่แตกต่างกัน
ส่วนต่อประสานการตั้งค่าเองไม่ได้ระบุคำสั่งซื้อใด ๆ โดยเฉพาะ อย่างไรก็ตามSortedSetทำ
Iterator ที่ส่งคืนโดย Set ไม่ถือว่าเป็นการส่งคืนข้อมูลตามวิธีที่ได้รับคำสั่ง ดูสอง java.util.Iterators ในคอลเล็กชันเดียวกัน: พวกเขาต้องส่งคืนองค์ประกอบตามลำดับเดียวกันหรือไม่?
เพียง แต่SortedSet
สามารถทำการสั่งซื้อของSet