มีโครงสร้างข้อมูลสำหรับรายการ / แผนที่ประเภทนี้หรือไม่?


22

อาจมีชื่อสำหรับสิ่งที่ฉันต้องการ แต่ฉันไม่ได้ตระหนักถึงมัน ฉันต้องการบางสิ่งที่คล้ายกับLinkedHashMapใน Java แต่มันจะส่งกลับค่า 'ก่อนหน้า' หากไม่มีค่าที่คีย์ที่ระบุ

นั่นคือฉันมีรายการของวัตถุที่จัดเก็บโดยคีย์จำนวนเต็ม (ซึ่งอยู่ในหน่วยของเวลาในกรณีของฉัน):

; key->value
10->A
15->B
20->C

ดังนั้นถ้าผมจะแบบสอบถามสำหรับค่าสำหรับคีย์ 0-9 nullก็จะกลับมา ส่วนพิเศษคือถ้าฉันถามหาสิ่งที่ 10 <= i <= 14 มันจะกลับมา A หรือสำหรับฉัน> = 20 ก็จะกลับ C

มีโครงสร้างข้อมูลสำหรับสิ่งนี้หรือไม่?


ฉันไม่ทราบว่ามีสิ่งที่นำมาใช้หรือไม่ แต่คุณอาจขยายที่มีอยู่ให้ทำสิ่งนี้ได้ ไม่ว่ามันจะเป็นไปตามเป้าหมายการแสดงของคุณหรือไม่โดยไม่ต้องเขียนซ้ำฉันไม่รู้ ...
Rig

1
+1 สำหรับคำถามที่ยอดเยี่ยม คนส่วนใหญ่ที่มีตัวเลขสามหลักต่ำถามคำถามประเภท "โปรดทำการบ้านของฉัน" ไม่ใช่กรณีที่นี่
Tulains Córdova

คำตอบ:


33

คุณกำลังมองหาNavigableMap นี่เป็นประเภทย่อยของ SortedMap ที่มีฟังก์ชั่นบางอย่างให้ใช้นอกเหนือจากลักษณะของแผนที่ที่เรียงลำดับ โปรดทราบว่าแผนที่นำทาง "มีวัตถุประสงค์เพื่อแทนที่อินเตอร์เฟส SortedMap" (การปรับปรุงกรอบงานคอลเล็กชัน Java SE 6 ) ทุกอย่างที่ดำเนินการในขณะนี้SortedMapการดำเนินการNavigableMapและนี่คือแนวโน้มที่จะยังคงเป็นจริง

โดยเฉพาะอย่างยิ่งวิธีการfloorKey(K key)ที่ "ส่งกลับคีย์ที่ยิ่งใหญ่ที่สุดน้อยกว่าหรือเท่ากับคีย์ที่กำหนดหรือเป็นโมฆะหากไม่มีคีย์ดังกล่าว

นี่เป็นเพียงหนึ่งในวิธีการมากมายที่ช่วยให้คุณได้รับคีย์เฉพาะหรือการส่งแผนที่

  • เพดาน / พื้น (รายการที่สูง / ต่ำกว่าพารามิเตอร์)
  • การเข้าถึงปุ่มหรือแผนที่ตามลำดับจากมากไปน้อย
  • head / tail (รายการน้อยกว่า / มากกว่าคีย์ที่กำหนด)
  • สูง / ต่ำ (คีย์ถัดไปที่สูงกว่าหรือต่ำกว่าพารามิเตอร์)
  • submap (ให้สองปุ่มส่งคืนแผนที่ที่อยู่ระหว่างสองปุ่ม)

Java มีสองการใช้งานของ NavigableMap - The TreeMapและConcurrentSkipListMap

ถ้าคุณดูที่ความคิด / การนำไปใช้ของรายการข้ามคุณจะเห็นว่าทำไมมันจะทำงานได้ดีกับโครงสร้างและแบบสอบถาม


1+ คำตอบที่ดี ไม่เคยคิดว่ามีแผนที่เฉพาะใน Java API
Tulains Córdova

@ user61852 ประเภทข้อมูลที่ฉันชอบคือรายการข้ามและฉันแหย่ไปกับมัน เมื่อฉันเห็นมันนำมาใช้ใน 1.6 ฉันมองเข้าไปในสิ่งที่มันมีให้และสังเกตเห็นอินเตอร์เฟสที่มันมีและทำให้ฉันคุ้นเคยกับมัน

นั่นคือสิ่งที่ทำให้ฉันมั่นใจว่า Java เป็นหนึ่งในภาษาที่ออกแบบมาอย่างดีที่สุดที่คุณสามารถหาได้
Tulains Córdova

1
โปรดทราบว่าแม้ว่าสิ่งนี้จะปรากฏขึ้นเพื่อแก้ไขปัญหาของ OP แต่ก็ไม่ได้ทำหน้าที่เหมือนLinkedHashMapที่เขากล่าวถึง ทั้งTreeMapมิได้ConcurrentSkipListMapมีการสั่งซื้อตามเวลาเช่นการแทรกLinkedHashMap, แต่พวกเขาจะได้รับคำสั่งจากหรือคีย์ของการสั่งซื้อธรรมชาติถ้าพวกเขาใช้Comparator Comparable
MikeFHay

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

1

สิ่งที่คุณกำลังมองหาคือตารางสัญลักษณ์ที่รองรับการสั่งซื้อ และในกรณีของคุณมันคือการใช้งานพื้น

การนำแฮชของตารางสัญลักษณ์ไปใช้นั้นเร็วที่สุด แต่ไม่ได้เสนอการดำเนินการตามคำสั่งเหล่านั้น

แต่การนำต้นไม้ไปใช้ในตารางสัญลักษณ์นั้นทำได้ ตัวอย่างของสิ่งนั้นใน Java คือคลาส TreeMap

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