अपनी स्थिति के अनुसार हाशप से एक तत्व कैसे प्राप्त करें, क्या यह संभव है?
अपनी स्थिति के अनुसार हाशप से एक तत्व कैसे प्राप्त करें, क्या यह संभव है?
जवाबों:
HashMaps आदेश को संरक्षित नहीं करते हैं:
यह वर्ग नक्शे के आदेश के अनुसार कोई गारंटी नहीं देता है; विशेष रूप से, यह गारंटी नहीं देता है कि आदेश समय के साथ स्थिर रहेगा।
LinkedHashMap पर एक नज़र डालें , जो एक पूर्वानुमान योग्य पुनरावृत्ति क्रम की गारंटी देता है।
LinkedHashMap का उपयोग करें और जब आपको स्थिति द्वारा पुनर्प्राप्त करने की आवश्यकता होती है, तो मानों को एक 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);
यदि आप उस आदेश को बनाए रखना चाहते हैं जिसमें आपने तत्वों को मानचित्र में जोड़ा है, तो LinkedHashMap
बस विरोध के रूप में उपयोग करें HashMap
।
यहाँ एक दृष्टिकोण है जो आपको मानचित्र में इसके सूचकांक द्वारा एक मूल्य प्राप्त करने की अनुमति देगा:
public Object getElementByIndex(LinkedHashMap map,int index){
return map.get( (map.keySet().toArray())[ index ] );
}
यदि आप किसी कारणवश, हैश-मैप के साथ रहना चाहते हैं, तो आप keySet को एक सरणी में बदल सकते हैं और सरणी में कुंजियों को अनुक्रमणित कर सकते हैं ताकि मानचित्र में मान प्राप्त हो सकें:
Object[] keys = map.keySet().toArray();
तब आप इस तरह के नक्शे का उपयोग कर सकते हैं:
map.get(keys[i]);
String myKey = keys[i].toString();
उपयोग करें LinkedHashMap
:
हैश तालिका और मैप किए गए इंटरफ़ेस की लिंक्ड सूची कार्यान्वयन, पूर्वानुमानित पुनरावृत्ति क्रम के साथ। यह कार्यान्वयन हैशपॉप से इस मायने में भिन्न है कि यह अपनी सभी प्रविष्टियों के माध्यम से चलने वाली दोहरी-लिंक की गई सूची को बनाए रखता है।
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;
}
फ़ंक्शन चयनित प्रविष्टि को वापस कर सकता है।
मैं 'स्थिति' के आधार पर मान रहा हूं कि आप उस क्रम का उल्लेख कर रहे हैं जिसमें आपने तत्वों को हैशमैप में डाला है। उस स्थिति में आप एक LinkedHashMap का उपयोग करना चाहते हैं। LinkedHashMap हालांकि एक सहायक विधि प्रदान नहीं करता है; आपको एक जैसा लिखना होगा
public Object getElementAt(LinkedHashMap map, int index) {
for (Map.Entry entry : map.entrySet()) {
if (index-- == 0) {
return entry.value();
}
}
return null;
}
एक अन्य कार्य दृष्टिकोण मानचित्र मानों को एक सरणी में बदल रहा है और फिर सूचकांक में तत्व को पुनः प्राप्त करता है। निम्नलिखित परिणामों के लिए निम्नलिखित दृष्टिकोणों का उपयोग करके 100 000 ऑब्जेक्ट्स के लिंक्डहाशपैप में सूचकांक खोजों द्वारा 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 से अनुक्रमणिका द्वारा सभी को पुनः प्राप्त करने वाले तत्व में बहुत भारी ऑपरेशन लगता है।
HashMap - और अंतर्निहित डेटा संरचना - हैश टेबल, स्थिति की धारणा नहीं है। लिंक्डलिस्ट या वेक्टर के विपरीत, इनपुट कुंजी एक 'बकेट' में बदल जाती है, जहां मूल्य संग्रहीत होता है। इन बाल्टियों को उस तरह से आदेशित नहीं किया जाता है, जो हाशपफ़ इंटरफ़ेस के बाहर समझ में आता है और इस तरह, आप जिन वस्तुओं को हाशप में डालते हैं, वे इस अर्थ में नहीं हैं कि आप अन्य डेटा संरचनाओं के साथ उम्मीद करेंगे।
HashMap की स्थिति की कोई अवधारणा नहीं है, इसलिए स्थिति से कोई वस्तु प्राप्त करने का कोई तरीका नहीं है। मैप्स में ऑब्जेक्ट्स सेट किए जाते हैं और कुंजियों द्वारा प्राप्त किए जाते हैं।
डिफ़ॉल्ट रूप से, java LinkedHasMap स्थिति के आधार पर मूल्य प्राप्त करने के लिए समर्थन नहीं करता है। इसलिए मेरा सुझाव है कि अनुकूलित के साथ जाएंIndexedLinkedHashMap
public class IndexedLinkedHashMap<K, V> extends LinkedHashMap<K, V> {
private ArrayList<K> keysList = new ArrayList<>();
public void add(K key, V val) {
super.put(key, val);
keysList.add(key);
}
public void update(K key, V val) {
super.put(key, val);
}
public void removeItemByKey(K key) {
super.remove(key);
keysList.remove(key);
}
public void removeItemByIndex(int index) {
super.remove(keysList.get(index));
keysList.remove(index);
}
public V getItemByIndex(int i) {
return (V) super.get(keysList.get(i));
}
public int getIndexByKey(K key) {
return keysList.indexOf(key);
}
}
तो आप इस अनुकूलित LinkedHasMap के रूप में उपयोग कर सकते हैं
IndexedLinkedHashMap<String,UserModel> indexedLinkedHashMap=new IndexedLinkedHashMap<>();
मान जोड़ने के लिए
indexedLinkedHashMap.add("key1",UserModel);
सूचकांक द्वारा प्राप्त करने के लिए
indexedLinkedHashMap.getItemByIndex(position);
HashMaps स्थिति तक पहुंच की अनुमति नहीं देता है, यह केवल हैश कोड के बारे में जानता है और यह मान को पुनः प्राप्त कर सकता है यदि यह कुंजी के हैश कोड की गणना कर सकता है। ट्रीमैप में ऑर्डर करने की धारणा है। लिंकेडस नक्शे उस क्रम को संरक्षित करते हैं जिसमें उन्होंने मानचित्र दर्ज किया था।
आप कुछ इस तरह से लागू करने की कोशिश कर सकते हैं:
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
मुझे उम्मीद है कि यह आपके लिए काम करेगा।