2009-06-10 16 views
11

सूर्य से लिंक्ड हैशमैप्स के स्रोत कोड को देखकर, मुझे लगता है कि KeyIterator नामक एक निजी श्रेणी है, मैं इसका उपयोग करना चाहूंगा। मैं कैसे पहुंच प्राप्त कर सकता हूं?मैं LinkedHashMap के लिए एक कुंजी इटरेटर कैसे प्राप्त करूं?

उत्तर

42

आप इसे

myMap.keySet().iterator(); 

तुम भी पता करने के लिए यह मौजूद है आवश्यकता नहीं होनी चाहिए फोन करके प्राप्त होता है; यह सिर्फ कार्यान्वयन का एक आर्टिफैक्ट है। आप सभी जानते हैं कि वे चाबियों को फिर से चलाने के लिए उड़ान बंदरों का उपयोग कर सकते हैं; जब तक वे spec के अनुसार पुनरावृत्त होते हैं, इससे कोई फर्क नहीं पड़ता कि वे इसे कैसे करते हैं।

वैसे, आप जानते हैं कि HashMap एक निजी वर्ग KeyIterator कहा जाता है (के रूप में करने ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, IdentityHashMap, TreeMap, और WeakHashMap)?
क्या इससे कोई फर्क पड़ता है कि आप HashMap की चाबियों के माध्यम से कैसे पुन: प्रयास करते हैं?


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

for (Key key : myMap.keySet()) { 
    Value val = myMap.get(key); 
    ... 
} 

आप लिखना चाहिए:

for (Map.Entry<Key, Value> entry : myMap.entrySet()) { 
    doSomethingWithKey(entry.getKey()); 
    doSomethingWithValue(entry.getValue()); 
    ... 
} 

तुम भी अगर आप चाहते हैं values() साथ मूल्यों पर पुनरावृति सकता है।

ध्यान दें कि जब से keySet, entrySet, और valuesMap interface में परिभाषित कर रहे हैं, वे सिर्फ LinkedHashMap नहीं किसी भी Map के लिए काम करेंगे।

+1

यह मेरे लिए ऐसा नहीं हुआ कि जब तक मैं आंतरिक निजी वर्ग नहीं देखता तब तक मैं एक लिंक्ड हैशैप पर फिर से चला सकता हूं। हालांकि उत्तर के लिए धन्यवाद। –

+0

मुझे नहीं पता था कि एंट्रीसेट() का क्या उपयोग है। लेकिन, यह लगभग सभी स्थानों में वास्तव में उपयोगी है, मैं हैश मैप का उपयोग करता हूं। धन्यवाद @ माइकल – sravanreddy001

3

आपको लिंकड हैशैप के आंतरिक कार्यान्वयन के हिस्से के रूप में परिभाषित कुछ भी नहीं करना चाहिए (यानी स्रोत कोड में लेकिन एपीआई में परिभाषित नहीं किया गया है)। क्या होता है यदि आंतरिक कार्यान्वयन अगली रिलीज में बदल जाता है? इसका उपयोग कर आपके सभी कोड तोड़ देंगे।

आप API को कोड और तरह

myMap.keySet().iterator() 
3

यह एक निजी वर्ग है, तो आप सीधे उपयोग नहीं कर सकते कुछ करना चाहिए।

private class KeyIterator extends LinkedHashIterator<K> { 

जब आप सामान्य इटरेटर का उपयोग करते हैं तो इसका एक उदाहरण लौटा दिया जाता है।

myMap.keySet().iterator() 
संबंधित मुद्दे