2009-03-19 16 views
238

जावा में, क्या कोई ऑब्जेक्ट है जो कुंजी/वैल्यू जोड़े को संग्रहीत करने और एक्सेस करने के लिए मानचित्र की तरह कार्य करता है, लेकिन कुंजी की ऑर्डर की गई सूची और मूल्यों की ऑर्डर की गई सूची वापस कर सकता है, जैसे कि कुंजी और मान सूचियां इसी क्रम में?जावा ऑर्डर किया गया मानचित्र

तो जैसा कि स्पष्टीकरण-दर-कोड, मैं कुछ है कि मेरे फर्जी OrderedMap तरह बर्ताव करता है के लिए देख रहा हूँ:

OrderedMap<Integer, String> om = new OrderedMap<>(); 
om.put(0, "Zero"); 
om.put(7, "Seven"); 

String o = om.get(7); // o is "Seven" 
List<Integer> keys = om.getKeys(); 
List<String> values = om.getValues(); 

for(int i = 0; i < keys.size(); i++) 
{ 
    Integer key = keys.get(i); 
    String value = values.get(i); 
    Assert(om.get(key) == value); 
} 
+4

यदि आप बस एक ही समय में दोनों के माध्यम से पुनरावृत्ति करना चाहते हैं, तो Map.entrySet() आपको किसी भी मानचित्र पर ऐसा करने देगा। LinkedHashMap का एक अच्छी तरह से परिभाषित आदेश है, लेकिन किसी भी मानचित्र के लिए प्रविष्टि सेट कुंजी/मान जोड़े को दर्शाता है। –

+4

यह कोड एक अच्छा उदाहरण नहीं है क्योंकि किसी भी मानचित्र कार्यान्वयन आपके नमूना कोड के रूप में व्यवहार करेगा। क्रमबद्ध, आदेश दिया या नहीं। –

+0

पीटर लॉरी: क्या आप उस पर विस्तार कर सकते हैं? मानचित्र इंटरफ़ेस क्रमशः सेट और संग्रह के रूप में कुंजी और मान देता है। इन में से किसी एक में ऑर्डर की गारंटी नहीं है, इसलिए यह कहना समझ में नहीं आता है कि प्रत्येक मानचित्र कार्यान्वयन मेरे उदाहरण कोड के रूप में व्यवहार करेगा। – Whatsit

उत्तर

306

SortedMap इंटरफ़ेस अपने दोस्त होना चाहिए (कार्यान्वयन TreeMap के साथ) है।

इंटरफ़ेस तरीकों है:

  • keySet() जो आरोही क्रम में कुंजियों का सेट देता है
  • values() जो इसी कुंजी के आरोही क्रम में सभी मूल्यों का एक संग्रह रिटर्न

तो यह इंटरफ़ेस बिल्कुल आपकी आवश्यकताओं को पूरा करता है। हालांकि, चाबियों का अर्थपूर्ण क्रम होना चाहिए। अन्यथा आप LinkedHashMap का उपयोग कर सकते हैं जहां ऑर्डर प्रविष्टि आदेश द्वारा निर्धारित किया जाता है।

+1

उदाहरण: सॉर्ट किए गए मैप <स्ट्रिंग, ऑब्जेक्ट> मानचित्र = नया ट्रीमैप <>(); – Ben

+5

ट्रीमैप का उपयोग करने के लिए यह आवश्यक है कि कुंजी वर्ग को तुलनात्मक इंटरफेस को कार्यान्वित करना होगा। यदि नहीं, तो किसी तरह का रनटाइम अपवाद फेंक दिया जाएगा। ट्रीएप मैप भी नक्शा सॉर्ट किया गया है, लेकिन मुझे लगता है कि लेखक सिर्फ आदेश (क्रमबद्ध नहीं) मानचित्र का उपयोग करना चाहता है। LinkedHashMap केवल आदेश दिया गया मानचित्र प्राप्त करने के लिए यह अच्छा विकल्प है (जैसा आपने कहा था, "प्रविष्टि आदेश द्वारा निर्धारित")। –

162

वहाँ एक उद्देश्य यह है कि भंडारण और कुंजी/मान पहुँचने के लिए एक मानचित्र की तरह काम करता है जोड़ों, लेकिन कुंजी की एक आदेशित सूची और मूल्यों की एक आदेशित सूची वापस कर सकते हैं, जैसे कि कुंजी और मूल्य सूचियां एक ही क्रम में हैं?

आप java.util.LinkedHashMap के लिए देख रहे हैं। आपको Map.Entry<K,V> जोड़े की एक सूची मिल जाएगी, जो हमेशा उसी क्रम में पुन: सक्रिय होती है। वह ऑर्डर वही है जैसा आपने आइटम को रखा था। वैकल्पिक रूप से, java.util.SortedMap का उपयोग करें, जहां कुंजी के पास प्राकृतिक ऑर्डरिंग हो या इसे Comparator द्वारा निर्दिष्ट किया गया हो।

+10

और केवल पाठक को दोबारा जांचने के लिए, क्योंकि परीक्षण करके सत्यापित करना मुश्किल है, 'keySet() 'विधि प्रभावी रूप से एक LinkedHashSet देता है जो आपके 'put()' कॉल के क्रम को दर्शाता है। ध्यान दें कि एक ही कुंजी के लिए 'put() 'पर बार-बार कॉल ऑर्डर नहीं बदलेगी जबतक कि आप पहले से ही कुंजी को हटा नहीं देते। –

6

मुझे लगता है कि सबसे करीब संग्रह आप ढांचे से मिलेगा SortedMap

+3

अगर मैंने सोचा कि यह इसके लिए अंक खोने लायक है तो मैं इस जवाब को वोट दूंगा। जैसा कि उपर्युक्त उत्तर बताता है, आपके उत्तर में LinkedHashMap के बारे में उचित जानकारी नहीं है, और सॉर्टेड मैप का थोड़ा सा स्पष्टीकरण भी अच्छा होगा। – CorayThan

+0

@ कोरयहान, उस मामले में आप सबसे अच्छे उत्तरों को ऊपर उठाते हैं, दूसरों को कम नहीं करते हैं जो सही हो सकते हैं लेकिन सर्वश्रेष्ठ नहीं ... –

+1

यही मैंने किया है। बस कह रहा है कि मैं समझ सकता हूं कि कोई इसे वोट क्यों देगा। – CorayThan

3

जावा 6 के बाद से वहाँ भी गैर अवरुद्ध TreeMap को धागे की सुरक्षित विकल्प। ConcurrentSkipListMap देखें।

3

आप NavigableMap इंटरफ़ेस का लाभ उठा सकते हैं जिसे किसी भी आरोही या अवरोही कुंजी क्रम में एक्सेस किया जा सकता है और ट्रैवर्स किया जा सकता है। यह इंटरफ़ेस intended to supersede सॉर्टेड मैप इंटरफ़ेस है। नेविगेट नक्शा आमतौर पर इसकी चाबियों के प्राकृतिक क्रम, या मानचित्र निर्माण समय पर प्रदान किए गए तुलनात्मक द्वारा क्रमबद्ध किया जाता है।

इसके तीन सबसे उपयोगी कार्यान्वयन हैं: TreeMap, ImmutableSortedMap, और ConcurrentSkipListMap

ट्री-मैप उदाहरण:

TreeMap<String, Integer> users = new TreeMap<String, Integer>(); 
users.put("Bob", 1); 
users.put("Alice", 2); 
users.put("John", 3); 

for (String key: users.keySet()) { 
    System.out.println(key + " (ID = "+ users.get(key) + ")"); 
} 

आउटपुट:

Alice (ID = 2) 
Bob (ID = 1) 
John (ID = 3) 
13

LinkedHashMap चाबियों का क्रम बनाए रखता है।

java.util.LinkedHashMap अन्यथा सामान्य हैश मैप की तरह काम करता प्रतीत होता है।

+0

यह प्रश्न का उत्तर नहीं प्रदान करता है। किसी लेखक से स्पष्टीकरण की आलोचना करने या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें - आप हमेशा अपनी पोस्ट पर टिप्पणी कर सकते हैं, और एक बार आपके पास पर्याप्त [प्रतिष्ठा] (http://stackoverflow.com/help/whats-reputation) हो [किसी भी पोस्ट पर टिप्पणी करने में सक्षम] [http://stackoverflow.com/help/privileges/comment)। – ianaya89

+1

@ ianaya89 मुझे लगता है कि यह एक असली जवाब है, लेकिन यह [जॉन फेमिनेला के] (http://stackoverflow.com/a/663388/1677209) उत्तर के समान है! – T30

+0

यदि आप ऑर्डर किए गए मानचित्र को प्राप्त करना चाहते हैं, जहां प्रविष्टियों को उस क्रम में संग्रहीत किया जाता है जैसे आप उन्हें मानचित्र में डालते हैं, तो LinkedHashMap का सही उत्तर है। यदि आप अपने मानचित्र में प्रविष्टियों को स्वतंत्र रूप से क्रमबद्ध करना चाहते हैं, तो क्रमबद्ध क्रम को क्रमबद्ध करें, सॉर्ट किए गए मैप से सही जवाब है। – Ralph

संबंधित मुद्दे