2010-04-21 16 views
34

जावा में अगर मैं एक HashMap की keySet() से अधिक पाशन कर रहा हूँ, मैं (पाश अंदर) कैसे, उस कुंजी के संख्यात्मक सूचकांक मिलता है?जावा - हैश मैप में कुंजी का सूचकांक प्राप्त करें?

असल में, जैसा कि मैं मानचित्र के माध्यम से लूप करता हूं, मैं 0,1,2 प्राप्त करने में सक्षम होना चाहता हूं ... मुझे लगता है कि यह प्रत्येक पुनरावृत्ति के साथ एक int घोषित करने और बढ़ने से क्लीनर होगा।

धन्यवाद।

+3

आपको इसके लिए क्या चाहिए? जैसा कि उत्तर में बताया गया है, मानचित्र में ऑर्डर आवश्यक रूप से स्थिर नहीं है, जब कुंजी जोड़ या हटा दी जाती है तो यह बदल सकती है। – extraneon

+5

क्या बेहतर है कि बराबर दो हैश मैप्स अभी भी अलग-अलग ऑर्डरिंग कर सकते हैं। वे इसे कर सकते हैं * भले ही उनके पास जोड़/हटाए जाने का एक ही इतिहास है * (विभिन्न क्षमताओं से यह होगा)। –

+0

http://stackoverflow.com/questions/18188739/arraylist-of-hashmap-or-linkedhashmap-to-get-item-by-index/18959271#18959271 –

उत्तर

4

सीधे शब्दों में कहें, हैश आधारित संग्रह अनुक्रमित नहीं कर रहे हैं ताकि आप इसे मैन्युअल रूप से करना है।

+0

क्या इस मामले में सिफारिश की डेटा संरचना है? –

18

हैश मैप में चाबियों का कोई परिभाषित क्रम नहीं है।

8

आप नहीं कर सकते हैं - एक सेट अव्यवस्थित है, इसलिए वहाँ कोई प्रदान की सूचकांक है। जैसा कि आप कहते हैं, आपको एक int घोषित करना होगा। बस याद रखें कि अगली बार जब आप keySet() को कॉल करेंगे तो आपको जरूरी परिणाम उसी क्रम में नहीं मिलेंगे।

+1

यदि ओपी वास्तव में * चाहता है *, ट्रीसेट और मानचित्र द्वारा समर्थित संग्रह लिखना मुश्किल नहीं है। इस तरह आप हमेशा एक ही क्रम में परिणाम प्राप्त कर सकते हैं।अब जब पुनरावृत्ति के दौरान मानचित्र संशोधित किया जाता है तो व्यवहार कैसे करें ओपी तक है लेकिन एक डेटा संरचना है जो एक मानचित्र है जहां चाबियाँ क्रमबद्ध सेट में हैं, निश्चित रूप से करने योग्य है। (बीटीडब्ल्यू मैं ओपी के प्रश्न के मुकाबले आपके उत्तर पर अधिक टिप्पणी कर रहा हूं)। – SyntaxT3rr0r

36

सुनिश्चित नहीं हैं कि अगर यह किसी भी "स्वच्छ" है, लेकिन:

List keys = new ArrayList(map.keySet()); 
for (int i = 0; i < keys.size(); i++) { 
    Object obj = keys.get(i); 
    // do stuff here 
} 
+1

या इसी तरह: 'int index = 0; के लिए (ऑब्जेक्ट कुंजी: map.keySet()) {'ऑब्जेक्ट वैल्यू = map.get (कुंजी); ++ सूचकांक; } // डांग स्वरूपण – benjineer

10

तुम सब करने की कोशिश कर रहे हैं hashmap खुद से लाभ प्राप्त है, तो आप निम्नलिखित की तरह कुछ कर सकते हैं:

for (Object key : map.keySet()) { 
    Object value = map.get(key); 
    //TODO: this 
} 

या, तो आप नक्शे की प्रविष्टियों से अधिक पुनरावृति कर सकते हैं अगर वह यह है कि क्या आप में रुचि रखते हैं:

for (Map.Entry<Object, Object> entry : map.entrySet()) { 
    Object key = entry.getKey(); 
    Object value = entry.getValue(); 
    //TODO: other cool stuff 
} 

के रूप में एक समुदाय, हम आपको बेहतर/अधिक उपयुक्त उत्तर देने में सक्षम हो सकते हैं अगर हमें कुछ विचार था कि आपको इंडेक्स की आवश्यकता क्यों है या आपने सोचा कि इंडेक्स आपके लिए क्या कर सकता है।

45

उपयोग HashMap के बजाय LinkedHashMap यह हमेशा एक ही क्रम में चाबियाँ वापस आ जाएगी (प्रविष्टि के रूप में) जब कीसेट()

अधिक विस्तार के लिए, Class LinkedHashMap

+0

आदेश महत्वपूर्ण नहीं हो सकता है - उदाहरण के लिए हमें केवल पहली या अंतिम पढ़ने वाली जोड़ी के लिए परीक्षण करने की आवश्यकता हो सकती है। – benjineer

4

मैं हाल ही में HashMap और पीछे अवधारणाओं सीख रही थी देख बुला यह स्पष्ट था कि चाबियों का कोई निश्चित आदेश नहीं था। पुनरावृति करने के लिए आप उपयोग कर सकते हैं:

Hashmap<String,Integer> hs=new Hashmap(); 
for(Map.Entry<String, Integer> entry : hs.entrySet()){ 
     String key=entry.getKey(); 
     int val=entry.getValue(); 
     //your code block 
    } 
2

एक समान रूप से व्यवहार्य विकल्प थॉमस के जवाब @Binil के रूप में इस पोस्ट कर रहा है - एक टिप्पणी के रूप में यह जोड़ने की कोशिश की, लेकिन यह सब की पठनीयता का आश्वस्त नहीं था।

int index = 0; 

for (Object key : map.keySet()) { 
    Object value = map.get(key); 
    ++index; 
} 

शायद मूल प्रश्न पोस्टर में मदद नहीं करता है के बाद से इस शाब्दिक स्थिति वे बचने की कोशिश कर रहे थे, लेकिन एक आसान जवाब के लिए खोज दूसरों की सहायता कर सकते हैं।

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