Java Set เก็บคำสั่งซื้อ?


179

ชุด Java เก็บคำสั่งซื้อหรือไม่? วิธีหนึ่งคืนชุดให้ฉันและคาดว่าข้อมูลจะได้รับคำสั่ง แต่วนซ้ำกับชุดข้อมูลจะไม่มีการเรียงลำดับ มีวิธีที่ดีกว่าในการจัดการสิ่งนี้หรือไม่? จำเป็นต้องเปลี่ยนวิธีการเพื่อส่งคืนสิ่งอื่นที่ไม่ใช่ชุดหรือไม่


3
"องค์ประกอบถูกส่งคืนในลำดับที่ไม่มี (ยกเว้นชุดนี้เป็นตัวอย่างของคลาสที่รับประกันได้)" เป็นสิ่งที่วิธี iterator สำหรับชุดพูดว่า พบได้ที่นี่
keyser

คำตอบ:


256

Setอินเตอร์เฟซที่ไม่ได้ให้การค้ำประกันการสั่งซื้อใด ๆ

อินเตอร์เฟสย่อยของมันSortedSetหมายถึงชุดที่เรียงลำดับตามเกณฑ์บางอย่าง ใน Java 6 SortedSetมีสองมาตรฐานภาชนะที่ใช้ พวกเขาเป็นและTreeSetConcurrentSkipListSet

นอกจากSortedSetอินเตอร์เฟสแล้วยังมีLinkedHashSetคลาสอีกด้วย มันจะจำลำดับที่องค์ประกอบถูกแทรกเข้าไปในชุดและส่งกลับองค์ประกอบในลำดับที่


21
นอกจากนี้เนื่องจากการแฮชสตริงที่แตกต่างกันใน Java 8 การสั่งซื้อเริ่มต้น (ไม่ได้เรียง) ในชุดและแผนที่จะเปลี่ยน หากคุณพึ่งพาการสั่งซื้อที่ไม่เรียงลำดับรหัสของคุณจะทำงานแตกต่างกันภายใต้ Java 8
rustyx

ฉันได้รับว่าชั้นเรียนไม่ได้สั่งซื้อเป็นเรื่องปกติ แต่พฤติกรรมที่ฉันคาดหวังคือปล่อยให้พวกเขาตามที่พวกเขาได้รับการแนะนำและไม่ยุ่งกับคำสั่งแทนที่จะเป็นเพียงการสับองค์ประกอบทุกครั้งที่รวมกัน วิธีการแก้ปัญหาของคุณไม่ดีที่สุดเหี่ยวแห้งเพราะฉันจะต้องใช้โครงสร้างทั้งหมดสำหรับพวกเขาที่จะเรียงลำดับทางเดียวกันที่พวกเขาแนะนำ: S
White_King

@White_King: ชุดเป็นแนวคิดทางคณิตศาสตร์ที่ไม่ได้มีความคิดของ "ลำดับการแทรก" ดังนั้นจึงเหมาะสมสำหรับอินเตอร์เฟส Java เพื่อทำตามอนุสัญญา มีชุดที่เรียงลำดับ แต่ลำดับจะถูกระบุโดยความสัมพันธ์ (comparator ใน Java) อีกครั้งจับคู่คำจำกัดความในทฤษฎีเซตกับคำนิยามใน Java ความคาดหวังของคุณในการรักษาลำดับการแทรกอาจมาจากรายการ แต่ชุดไม่ใช่รายการ
Konrad Höffner

103

LinkedHashSetเป็นสิ่งที่คุณต้องการ


43
A Listไม่ใช่Set(ไม่รับประกันความเป็นสมาชิกที่ไม่เหมือนใคร)
การชดเชย จำกัด

10
ในกรณีเฉพาะธุรกิจหลายรายการไม่สามารถใช้เพียงเพื่อรักษาลำดับแทนที่จะเป็นชุด LinkedHashSet รักษาคำสั่งซื้อและจัดเก็บที่ไม่ซ้ำกัน
gubs

18

สมาชิกหลายคนแนะนำให้ใช้LinkedHashSetเพื่อรักษาลำดับของการรวบรวม คุณสามารถห่อชุดของคุณโดยใช้การดำเนินการนี้

SortedSetการดำเนินการสามารถใช้สำหรับการเรียงลำดับ แต่สำหรับการใช้งานวัตถุประสงค์ของคุณLinkedHashSet

นอกจากนี้จากเอกสาร

"การติดตั้งนี้ทำให้ลูกค้าไม่ได้รับการสั่งซื้อที่ไม่เป็นระเบียบโดยทั่วไปมีการสั่งซื้อที่ยุ่งเหยิงโดย HashSet โดยไม่มีค่าใช้จ่ายเพิ่มขึ้นที่เกี่ยวข้องกับ TreeSet ซึ่งสามารถใช้สร้างสำเนาของชุดที่มีคำสั่งเดียวกับต้นฉบับโดยไม่คำนึงถึงต้นฉบับ การใช้งานของชุด: "

ที่มา: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html


9

Set เป็นเพียงส่วนต่อประสาน ในการรักษาคำสั่งซื้อคุณต้องใช้การใช้งานเฉพาะของอินเทอร์เฟซนั้นและอินเทอร์เฟซย่อย SortedSet ตัวอย่างเช่น TreeSet หรือ LinkedHashSet คุณสามารถห่อ Set ด้วยวิธีนี้:

Set myOrderedSet = new LinkedHashSet(mySet);

7

นี่เป็นบทสรุปโดยย่อเกี่ยวกับลักษณะการสั่งซื้อของการSetใช้งานมาตรฐานที่มีอยู่ใน Java:

  1. เก็บคำสั่งแทรก: LinkedHashSetและCopyOnWriteArraySet (ปลอดภัยสำหรับเธรด)
  2. เก็บรายการที่เรียงลำดับภายในชุด: TreeSet , EnumSet (เฉพาะ enums) และConcurrentSkipListSet (ปลอดภัยต่อเธรด)
  3. ไม่เก็บรายการตามลำดับใด ๆ : HashSet (อันที่คุณพยายาม)

สำหรับกรณีเฉพาะของคุณคุณสามารถเรียงลำดับรายการก่อนจากนั้นใช้รายการใดก็ได้ 1 หรือ 2 (เป็นไปได้มากที่สุดLinkedHashSetหรือTreeSet) หรืออีกวิธีหนึ่งและมีประสิทธิภาพมากขึ้นคุณสามารถเพิ่มข้อมูลที่ไม่เรียงลำดับTreeSetซึ่งจะจัดการการเรียงลำดับให้คุณโดยอัตโนมัติ


7

เพื่อรักษาการใช้คำสั่งหรือListLinkedHashSet


1
มันLinkedHashSetไม่ได้ Map...
Marko Topolnik

ฉันต้องการชุดไม่ใช่รายการฉันต้องการชุดที่ยังคงรักษาลำดับการฉีดของวัตถุที่ฉันเดา
White_King

5

LinkedHashSet เป็น HashSet เวอร์ชันที่สั่งซื้อซึ่งจะรักษารายการที่เชื่อมโยงเป็นสองเท่าในองค์ประกอบทั้งหมด ใช้คลาสนี้แทน HashSet เมื่อคุณใส่ใจกับคำสั่งวนซ้ำ


3

จาก javadoc สำหรับSet.iterator():

ส่งคืนตัววนซ้ำกับองค์ประกอบในชุดนี้ องค์ประกอบจะถูกส่งกลับในลำดับที่ไม่มี (ยกเว้นชุดนี้เป็นตัวอย่างของคลาสที่ให้การรับประกัน)

และตามที่ระบุไว้แล้วโดยshuuchan , a TreeSetคือการดำเนินการของSetที่มีคำสั่งรับประกัน:

องค์ประกอบจะถูกจัดเรียงโดยใช้การจัดเรียงตามธรรมชาติหรือโดย Comparator ที่มีให้ ณ เวลาการสร้างที่กำหนด


3

โดยปกติการตั้งค่าจะไม่รักษาคำสั่งซื้อเช่น HashSet เพื่อค้นหา emelent อย่างรวดเร็ว แต่คุณสามารถลองใช้ LinkedHashSet ได้ซึ่งจะเป็นการรักษาลำดับที่คุณใส่ไว้


1

มี 2 ​​สิ่งที่แตกต่างกัน

  1. เรียงลำดับองค์ประกอบในชุด ที่เรามี SortedSet และการใช้งานที่คล้ายกัน
  2. รักษาลำดับการแทรกในชุด ซึ่ง LinkedHashSet และ CopyOnWriteArraySet (thread-safe) สามารถใช้ได้

0

ส่วนต่อประสานการตั้งค่าเองไม่ได้ระบุคำสั่งซื้อใด ๆ โดยเฉพาะ อย่างไรก็ตามSortedSetทำ



-2

เพียง แต่SortedSetสามารถทำการสั่งซื้อของSet


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