क्या इस प्रकार की सूची / मानचित्र के लिए कोई डेटा संरचना है?


22

शायद मैं जो चाहता हूं उसका नाम है, लेकिन मुझे इसके बारे में पता नहीं है। मुझे LinkedHashMapजावा में कुछ इसी तरह की जरूरत है , लेकिन जहां निर्दिष्ट कुंजी पर कोई मूल्य नहीं है, तो यह 'पिछले' मान लौटाता है।

अर्थात्, मेरे पास पूर्णांक कुंजी द्वारा संग्रहीत वस्तुओं की सूची है (जो मेरे मामले में समय की इकाइयों में है):

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

इसलिए, यदि मैं कुंजी 0-9 के लिए मान के लिए क्वेरी कर रहा था, तो यह वापस आ जाएगी null । विशेष भाग यह है कि अगर मैंने किसी चीज के लिए १० <= i <= १४ की बोली लगाई, तो वह ए। या I = २० के लिए लौटेगा, यह सी लौटेगा।

क्या इसके लिए कोई डेटा संरचना है?


मुझे नहीं पता कि क्या कोई कार्यान्वित किया गया है, लेकिन आप ऐसा करने के लिए मौजूदा एक का विस्तार कर सकते हैं। यह आपके प्रदर्शन के लक्ष्यों को पूरा करेगा या नहीं एक पुनर्लेखन के बिना मैं नहीं जानता ...
रिग

1
महान प्रश्न के लिए +1। तीन कम अंकों के प्रतिनिधि वाले अधिकांश लोग "कृपया मेरा होमवर्क करें" प्रश्न पूछते हैं। यहां मामला नहीं है।
ट्यूलेंस कोर्डोवा

जवाबों:


33

आप एक NavigableMap की तलाश में हैं । यह SortedMap का एक उपप्रकार है जिसमें कुछ कार्यों के अलावा मानचित्र की प्रकृति के अलावा कुछ कार्य उपलब्ध हैं। ध्यान दें कि नेविगेट करने योग्य नक्शा "सॉर्टेड मैप इंटरफ़ेस को सुपरसेड करने का इरादा है।" ( जावा एसई 6 संग्रह फ्रेमवर्क संवर्द्धन )। वह सब कुछ जो वर्तमान में लागू होता SortedMapहैNavigableMap और यह सच होने की संभावना है।

विशेष रूप से, विधि floorKey(K key) जो "दी गई कुंजी के बराबर या उसके बराबर सबसे बड़ी कुंजी लौटाती है, या ऐसी कोई कुंजी नहीं होने पर अशक्त।

यह कई तरीकों में से एक है जो आपको मानचित्र की विशिष्ट कुंजी या सबमैप प्राप्त करने की अनुमति देता है।

  • छत / मंजिल (प्रवेश जो पैरामीटर से अधिक / कम है)
  • अवरोही क्रम में कुंजियों या मानचित्र का उपयोग
  • सिर / पूंछ (किसी दिए गए कुंजी से कम / अधिक प्रविष्टियाँ)
  • उच्च / निम्न (अगली कुंजी जो पैरामीटर से अधिक या निम्न है)
  • उपमैप (दो कुंजी दिए गए, दो कुंजी के बीच का नक्शा लौटाएं)

जावा के पास नेविगेबल स्पा के दो कार्यान्वयन हैं - ट्रीपैप और कॉनकंटर्स्क्लिप्लिस्टस्ट

यदि आप एक स्किप सूची के विचार / कार्यान्वयन को देखते हैं, तो आप देखेंगे कि यह इस तरह की संरचना और इसके प्रश्नों के साथ वास्तव में क्यों अच्छा काम करेगा।


1+ बढ़िया जवाब। ऐसा कभी नहीं सोचा था कि जावा एपीआई में ऐसा विशिष्ट मानचित्र मौजूद है।
ट्यूलेंस कोर्डोवा

@ user61852 मेरा पसंदीदा डेटाटाइप स्किप लिस्ट है और मैंने इसके साथ पोज़ किया है। जब मैंने इसे 1.6 में कार्यान्वित देखा, तो मैंने देखा कि यह सब क्या प्रदान करता है और इसमें जो इंटरफेस है और इस तरह से मेरी परिचितता है, उस पर ध्यान दिया।

इस तरह की चीजें हैं जो मुझे समझाती हैं कि जावा सबसे अच्छी डिजाइन की गई भाषाओं में से एक है जिसे आप पा सकते हैं।
ट्यूलेंस कोरडोवा

1
ध्यान दें कि जब यह ओपी के मुद्दे को संबोधित करता है, तो यह उस तरह का कार्य नहीं करता जैसा LinkedHashMapवह उल्लेख करता है। न तो TreeMapहै और न ही ConcurrentSkipListMapप्रविष्टि समय से आदेश दिया जाता है की तरह LinkedHashMap, बल्कि वे एक द्वारा आदेश दिया जाता है Comparatorअगर वे लागू करने या कुंजी के प्राकृतिक आदेश Comparable
मिकफ हए

1
बहुत अच्छी बात है। मंजिल संचालन वह है जो मैं देख रहा था, तुलनित्र मैं आसानी से जोड़ सकता हूं। और मेरे मामले में यह पहिया को सुदृढ़ करने के बजाय तुलनित्र को लागू करने के लिए बहुत अच्छे काम करता है। धन्यवाद।
निक

1

आप जो देख रहे हैं वह एक प्रतीक तालिका है जो ऑर्डर किए गए कार्यों का समर्थन करती है। और आपके मामले में यह फर्श का संचालन है।

एक प्रतीक तालिका का हैश कार्यान्वयन सबसे तेज़ है, लेकिन यह उन ऑर्डर किए गए कार्यों की पेशकश नहीं करता है।

लेकिन प्रतीक तालिकाओं का वृक्ष कार्यान्वयन करता है। जावा में इसका एक उदाहरण ट्रीपेज वर्ग है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.