2012-04-30 18 views
27

का उपयोग करके LinkedHashMap में कुंजी/मान की स्थिति कैसे प्राप्त करें हाय मेरे पास एक LinkedHashMap (जानकारी कहा जाता है) जिसमें नाम/आयु (स्ट्रिंग/int) जोड़े शामिल हैं। मैं जानना चाहता हूं, अगर मैं कुंजी इनपुट करता हूं तो मुझे कुंजी/मूल्य की स्थिति कैसे प्राप्त हो सकती है। उदाहरण के लिए, यदि मेरा लिंक्ड हैशैप इस तरह दिखता है {bob = 12, jeremy = 42, carly = 21} और मैं जेरेमी खोजना चाहता था, तो इसे 1 स्थिति में 1 के रूप में वापस करना चाहिए। मुझे उम्मीद थी कि मैं info.getIndex जैसे कुछ का उपयोग कर सकता हूं ("जेरेमी")इसकी कुंजी

+1

देखें [क्यों-नहीं-linkedhashmap-provide-access-by-index] (http://stackoverflow.com/questions/5666820/why-doesnt-linkedhashmap-provide-access-by-index) – nawfal

उत्तर

22

HashMap सामान्य रूप से कार्यान्वयन Iteration के लिए अनुक्रमित नहीं हैं।

LinkedHashMappredictablelyIteration (प्रविष्टि आदेश में) के लिए आदेश दिया है, लेकिन List इंटरफेस और एक LinkedList (जो क्या कुंजी सेट प्रविष्टि आदेश में दर्पण है) का खुलासा नहीं करता सूचकांक स्थिति में ही ट्रैक नहीं करता है या तो, यह बहुत in- है सूचकांक को खोजने के लिए भी कुशल। LinkedHashMap आंतरिक LinkedList के संदर्भ का खुलासा नहीं करता है।

वास्तविक "लिंक किए गए सूची" व्यवहार कार्यान्वयन विशिष्ट है। कुछ वास्तव में LinkedList के उदाहरण का उपयोग कर सकते हैं कुछ लोगों के पास Entry पिछले और अगले Entry ट्रैक करें और इसका उपयोग कार्यान्वयन के रूप में करें। स्रोत को देखे बिना कुछ भी न मानें।

KeySet कि चाबी क्योंकि हैशिंग विरासत में मिला HashMap के समर्थन डेटा संरचना में प्लेसमेंट के लिए इस्तेमाल किया एल्गोरिदम के आदेश की गारंटी नहीं है और साथ ही होता है। तो आप इसका उपयोग नहीं कर सकते।

अपना खुद का कार्यान्वयन लिखने के बिना ऐसा करने का एकमात्र तरीका Iterator पर चलना है जो LinkedList मिररिंग का उपयोग करता है और जहां आप हैं, वहां एक गिनती रखें, यह बड़े डेटा सेट के साथ बहुत ही कुशल होगा।

समाधान

यह लग रहा है क्या की तरह आप चाहते हैं मूल प्रविष्टि आदेश में सूचकांक पदों है, तो आप एक ArrayList की तरह कुछ में KeySet में कुंजी को प्रतिबिंबित करने के लिए होता है करने के लिए अद्यतन के साथ समन्वयन में रखें HashMap और स्थिति खोजने के लिए इसका इस्तेमाल करें। HashMap का उप-वर्ग बनाना, IndexedHashMap कहें और ArrayList आंतरिक रूप से जोड़कर .getKeyIndex(<K> key) जोड़ना जो आंतरिक ArrayList.indexOf() पर प्रतिनिधि शायद इस बारे में जाने का सबसे अच्छा तरीका है।

यह LinkedHashMap है, लेकिन LinkedListArrayList के बजाय KeySet प्रतिबिंबित करता है।

+1

मैंने सोचा कि LinkedHashMap आदेश बरकरार रखता है। क्या कोई ऐसी चीज है जिसका मैं उपयोग कर सकता हूं जो कुंजी/मूल्य स्टोर कर सकता है लेकिन ऑर्डर बनाए रख सकता है? – Matt9Atkins

+1

यह बरकरार रहता है, * ऑर्डर * लेकिन * स्थिति * ट्रैक नहीं करता है। –

+0

@ हर्नान ने प्रश्न और उत्तर के लिए उत्तर पढ़ा, वे स्थिति को भी ट्रैक करना चाहते हैं, जिसे मैं अपने उत्तर में विस्तार से बताता हूं। –

0

लिंक्ड हैशैप में "अनुमानित पुनरावृत्ति आदेश" (javadoc) है। आइटम उनके स्थान को नहीं जानते हैं, हालांकि, आपको इसे प्राप्त करने के लिए संग्रह को फिर से शुरू करना होगा। यदि आप एक बड़ा नक्शा बनाए रखते हैं तो आप भंडारण के लिए एक अलग संरचना का उपयोग करना चाह सकते हैं।

संपादित करें: स्पष्ट किया यात्रा

+0

* "कुंजी 'सेट' चलना आपको कोई अच्छा नहीं करेगा, इसे 'सेट' द्वारा समर्थित किया जाता है, और यह अन-आदेश दिया जाता है। 'लिंक्डलिस्ट' का उपयोग केवल 'इटरेटर' के लिए किया जाता है। [जब संदेह होता है स्रोत का उपयोग करें] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashMap.java#HashMap.keySet%28%29)। –

+0

दरअसल, मेरा मतलब एंट्री सेट था। यही कारण है कि एक पुनरावृत्ति ऑर्डर बिट उद्धृत ... अंतर्निहित इटरेटर उपयोग। मेरे हिस्से पर शब्दों की खराब पसंद। –

+0

जावाडोक में पहला पैराग्राफ कहता है कि यह सम्मिलित क्रम में है, जो उसने पूछा के लिए। मुझे लगता है कि हम वही बात कह रहे हैं, वैसे भी। संपादनों ने आपका उत्तर स्पष्ट कर दिया है। –

0

आप गूगल अमरूद पुस्तकालय से com.google.common.collect.LinkedListMultimap उपयोग कर सकते हैं।आपको इस कक्षा के बहुमूल्य व्यवहार की आवश्यकता नहीं है जो आप चाहते हैं कि keys() विधि गारंटी देता है कि वे सम्मिलन आदेश में वापस लौटाए जाते हैं और फिर सूची बनाने के लिए उपयोग किया जा सकता है, आप आवश्यक सूचकांक स्थिति

9
खोजने के लिए indexOf() का उपयोग कर सकते हैं
int pos = new ArrayList<String>(info.keySet()).indexOf("jeremy") 
+1

अफिक 'कीसेट()' ऑर्डर गारंटी नहीं है। – membersound

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