2012-06-16 24 views
9

क्या हैशैप लिफो या फीफो प्रकृति में है? अगर मेरे मानचित्र फार्म की है ->लिंक्ड हैशैप लिफो या फीफो?

map.put(1,"one"); 
map.put(2,"two"); 

क्या आदेश अगर मैं कीसेट उपयोग करके मानचित्र पर पुनरावृति के लिए किया गया हो सकता है ??

संपादित करें: मुझे लगता है कि मैंने वास्तव में दो अलग-अलग अवधारणाओं को भ्रमित कर दिया है। मुझे सवाल दोबारा दोहराएं। मुझे ऑर्डरसेट का उपयोग करके मात्रा का सामना करना होगा? यह इंगित करने के लिए धन्यवाद कि btw.i किसी भी प्रविष्टि को हटाने का इरादा नहीं है।

+0

उपरोक्त, क्योंकि मुझे लगता है कि एक डाउनवॉट अनचाहे था – Dancrumb

+0

यह 'आखिरी में' है लेकिन आपके उपयोग पर निर्भर करता है कि हर जगह से हटाया जा सकता है। –

उत्तर

11

एक लिंक किए गए हैश मानचित्र में बैकिंग दोगुनी-लिंक्ड सूची में तत्व अंत में जोड़े गए हैं (स्पष्ट रूप से: पुनरावृत्ति क्रम को संरक्षित करने के लिए), लेकिन सूची में किसी भी भाग से हटाया जा सकता है क्योंकि तत्व मानचित्र से हटा दिए जाते हैं वहाँ एक नक्शे में निष्कासन आदेश की कोई अवधारणा है, और फलस्वरूप कोई निष्कासन आदेश किसी लिंक किए गए हैश में समर्थन सूची के लिए माना जा सकता है - LIFO या फीफो के रूप में, यह न तो है:, यह (मानचित्र और विस्तार के द्वारा) समर्थन सूची लेबल करने के लिए गलत है नक्शा।

क्या एक जुड़ा हुआ हैश नक्शा गारंटी है कि इसकी सामग्री (यह हो: चाबियाँ या प्रविष्टियां) उसी क्रम में हो जाएंगी जिसमें तत्व नक्शे में डाले गए थे; documentation से:

यह कार्यान्वयन हैश मैप से अलग है जिसमें यह अपनी सभी प्रविष्टियों के माध्यम से एक दोगुनी-लिंक्ड सूची को बनाए रखता है। यह लिंक्ड सूची पुनरावृत्ति क्रम को परिभाषित करती है, जो आमतौर पर वह क्रम होता है जिसमें कुंजी को मानचित्र में सम्मिलित किया गया था (सम्मिलन-आदेश)।

संपादित करें:

सवाल का अंतिम संपादन के बारे में

, एक LinkedHashMapकी गारंटी देता है कि keySet() की यात्रा के क्रम में एक ही क्रम में तत्वों डाला गया होगा: 1, 2 उदाहरण के लिए सवाल में इसका फीफो/लिफो के साथ कुछ लेना देना नहीं है, उन अवधारणाओं के आदेश से निपटने के क्रम में तत्वों को हटा दिया जाता है, और तत्वों को डालने के बाद वे पुनरावृत्ति आदेश से संबंधित नहीं होते हैं।

+0

डाउनवॉटर, समझाने की देखभाल? –

+0

(1) लिंक्ड हैशैप में ऑर्डर * परिभाषित * प्रविष्टि आदेश के रूप में है, इसलिए (2) ऑर्डरिंग की अवधारणा मौजूद है, और (3) 'निष्कासन आदेश' के बारे में सवाल में कुछ भी नहीं है, जो कुछ भी हो सकता है। आपके संपादन में जोड़ा गया आपका दूसरा अनुच्छेद अब आपके पहले पैराग्राफ के विपरीत है। – EJP

+1

@EJP LIFO का अर्थ है कि जो अंतिम तत्व जोड़ा गया था वह पहला _removed_ होगा जब निष्कासन ऑपरेशन होता है। एफआईएफओ का मतलब है कि हटाए जाने वाले पहले तत्व को पहला _removed_ होगा जब एक निष्कासन ऑपरेशन होता है। तो आप देखते हैं, लिफो/फीफो के पास सब कुछ हटाने के साथ है, और पुनरावृत्ति या आदेश के साथ कुछ भी नहीं है, ओपी विभिन्न अवधारणाओं को भ्रमित कर रहा है, और आप भी हैं। –

5

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

1

जावा डॉक्स के मुताबिक, अगर आप मानचित्र पर दोहराना चाहते थे, कीसेट प्रविष्टि-क्रम में होगा। तो मौजूदा कुंजी पर, आपको प्राप्त पहली कुंजी दर्ज की गई पहली कुंजी है। नोट, एक कुंजी-मूल्य जोड़ी को पुन: सम्मिलित करने से मूल कुंजी स्थिति नहीं बदली जाती है।

1

पहुँच आदेश उपयोग नहीं किया जाता है (मानक मामले) आप एक लिंक्ड सूची w/बहुत तेजी से पहुँच हे (1) कुंजी के द्वारा के रूप में LHM विचार कर सकते हैं।

कि पहलू में यह फीफो जब पहुँच आदेश अप्रयुक्त है (ग-tors को देखो) है। जब एक्सेस ऑर्डर का उपयोग किया जाता है तो सम्मिलन आदेश कोई फर्क नहीं पड़ता कि get() ऑपरेशंस हैं, क्योंकि वे प्रविष्टियों को पुन: व्यवस्थित करते हैं। protected boolean removeEldestEntry(Map.Entry<K,V> eldest) सबसे बड़ा = फीफो देखें।

मूलतः LHM चाबियाँ पर एक हैश सूचकांक के साथ Map.Entry<Key, Value> का एक अच्छा दोगुना लिंक्ड सूची है। मैं अपने मौजूदा इम्प्लेक्स में कभी भी वेनिला हैश मैप का उपयोग नहीं करता हूं।एलएचएम पर इसका बहुत कम लाभ है - कम स्मृति पदचिह्न लेकिन भयानक पुनरावृत्ति। जावा 8 (या 9) शायद आखिरकार हैश मैप को ठीक कर सकता है, उम्मीद है कि डौग ली अपने प्रभाव को दबाएंगे।

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