2011-03-08 6 views
70

हैश मैप से अपनी स्थिति से तत्व कैसे पुनर्प्राप्त करें, क्या यह संभव है?क्या हैश मैप से तत्व को अपनी स्थिति से प्राप्त करना संभव है?

+10

"स्थिति" से आपका क्या मतलब है? हैशमैप्स का आदेश नहीं दिया जाता है, इसलिए उनके पास "स्थिति" की सामान्य धारणा नहीं होती है जिसे आप वेक्टर की तरह कुछ प्राप्त करेंगे। – Mat

+0

क्या आपका मतलब इसके सम्मिलन आदेश या किसी अन्य आदेश से है? –

+0

@ मार्क: सम्मिलन आदेश। – Eugene

उत्तर

80

HashMaps आदेश को संरक्षित नहीं है:

इस वर्ग नक्शे के आदेश के रूप में कोई गारंटी नहीं देता; विशेष रूप से, यह गारंटी नहीं देता है कि आदेश समय के साथ स्थिर रहेगा।

LinkedHashMap पर एक नज़र डालें, जो एक अनुमानित पुनरावृत्ति आदेश की गारंटी देता है।

+5

यह वास्तव में प्रश्न का उत्तर नहीं देता है। नीचे दिए गए अन्य उत्तर अधिक उपयोगी हैं। – forresthopkinsa

+4

सम्मान के साथ, यह दस्तावेज उद्धृत करता है कि * सीधे * प्रश्न –

+0

का उत्तर देता है भले ही आदेश समय के साथ स्थिर न हो, फिर भी किसी भी स्थिति में सदस्यों में से एक को पुनर्प्राप्त करना संभव हो सकता है। – Beginner

12

उपयोग LinkedHashMap: मानचित्र इंटरफ़ेस का

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

+20

जो ऑर्डर को सुरक्षित रखेगा, लेकिन आप अभी भी अपने इंडेक्स द्वारा आइटम तक नहीं पहुंच सकते हैं। आपको – Bozho

+0

को फिर से चालू करना होगा यह लिंक एपीआई के पुराने संस्करण के लिए है। मैं जावा 6 या 7 एपीआई से जोड़ने का सुझाव दूंगा। – jzd

2

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

2

हैश मैप की कोई अवधारणा नहीं है स्थिति की स्थिति में ऑब्जेक्ट प्राप्त करने का कोई तरीका नहीं है। मानचित्र में ऑब्जेक्ट्स सेट और कुंजी से प्राप्त होते हैं।

2

मैं 'स्थिति' द्वारा मान रहा हूं कि आप उस आदेश का जिक्र कर रहे हैं जिसमें आपने तत्वों को हैश मैप में डाला है। उस स्थिति में आप एक LinkedHashMap का उपयोग करना चाहते हैं। LinkedHashMap हालांकि एक एक्सेसर विधि प्रदान नहीं करता है; आप, HashMaps एक

तरह
public Object getElementAt(LinkedHashMap map, int index) { 
    for (Map.Entry entry : map.entrySet()) { 
     if (index-- == 0) { 
      return entry.value(); 
     } 
    } 
    return null; 
} 
1

स्थिति से उपयोग की अनुमति नहीं है लिखने के लिए की आवश्यकता होगी यह केवल हैश कोड के बारे में जानता है और और अगर यह कुंजी के हैश कोड गणना कर सकते हैं यह मान प्राप्त कर सकते हैं। TreeMaps ऑर्डर करने की धारणा है। Linkedhas नक्शे उस क्रम को संरक्षित करते हैं जिसमें उन्होंने मानचित्र दर्ज किया था।

80

एक लिंक्ड हैशैप का उपयोग करें और जब आपको स्थिति से पुनर्प्राप्त करने की आवश्यकता होती है, तो मानों को एक ArrayList में परिवर्तित करें।

LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<String,String>(); 
/* Populate */ 
linkedHashMap.put("key0","value0"); 
linkedHashMap.put("key1","value1"); 
linkedHashMap.put("key2","value2"); 
/* Get by position */ 
int pos = 1; 
String value = (new ArrayList<String>(linkedHashMap.values())).get(pos); 
+2

हैश मैप से चाबियों की एक प्रति को तुरंत चालू करने के लिए हमेशा की आवश्यकता है ?? – Richard

6

LinkedHashMap का उपयोग करें और इस फ़ंक्शन का उपयोग करें।

private LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>(); 

इस तरह परिभाषित करें और।

private Entry getEntry(int id){ 
     Iterator iterator = map.entrySet().iterator(); 
     int n = 0; 
     while(iterator.hasNext()){ 
      Entry entry = (Entry) iterator.next(); 
      if(n == id){ 
       return entry; 
      } 
      n ++; 
     } 
     return null; 
    } 

फ़ंक्शन चयनित प्रविष्टि को वापस कर सकता है।

27

यदि आप उस क्रम को बनाए रखना चाहते हैं जिसमें आपने मानचित्र में तत्व जोड़े हैं, तो के विपरीत LinkedHashMap का उपयोग करें।

यहाँ एक दृष्टिकोण है कि आप नक्शे में अपने सूचकांक द्वारा एक मूल्य प्राप्त करने के लिए अनुमति देगा:

public Object getElementByIndex(LinkedHashMap map,int index){ 
    return map.get((map.keySet().toArray())[ index ]); 
} 
+0

सरलतम मुझे कहना होगा ... हर चीज को बदलने के बजाय, आप केवल कीसेट का उपयोग कर रहे हैं। शानदार – kirtan403

0

आप देखने के लिए ऐसा ही कुछ को लागू करने की कोशिश कर सकते हैं पर:

Map<String, Integer> map = new LinkedHashMap<String, Integer>(); 
map.put("juan", 2); 
map.put("pedro", 3); 
map.put("pablo", 5); 
map.put("iphoncio",9) 

List<String> indexes = new ArrayList<String>(map.keySet()); // <== Parse 

System.out.println(indexes.indexOf("juan"));  // ==> 0 
System.out.println(indexes.indexOf("iphoncio"));  // ==> 3 

मैं उम्मीद है इससे आपका काम बनेगा।

1

एक और कामकाजी दृष्टिकोण नक्शा मानों को एक सरणी में बदल रहा है और फिर सूचकांक पर तत्व पुनर्प्राप्त कर रहा है। निम्नलिखित तरीकों का उपयोग कर 100 000 वस्तुओं की LinkedHashMap में सूचकांक खोजों द्वारा 100 000 तत्व के टेस्ट रन निम्न परिणाम को जन्म दिया:

//My answer: 
public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){ 
    return map.values().toArray(new Particle[map.values().size()])[index]; 
} //68 965 ms 

//Syd Lambert's answer: 
public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){ 
    return map.get((map.keySet().toArray())[ index ]); 
} //80 700 ms 

सभी LinkedHashMap से सूचकांक द्वारा सभी को पुन: प्राप्त तत्व में बहुत भारी आपरेशन हो रहा है।

7

आप किसी कारण से, HashMap के साथ रहना है, तो आप कीसेट एक सरणी और सूचकांक के लिए कुंजी सरणी में मूल्यों को प्राप्त करने के लिए नक्शे में इतनी तरह परिवर्तित कर सकते हैं:

Object[] keys = map.keySet().toArray(); 

इसके बाद आप मानचित्र का उपयोग कर सकते हैं जैसे:

map.get(keys[i]); 
+0

ध्यान दें कि arr [i] में बदला जाना चाहिए: कुंजी [i] –

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