2012-11-27 17 views
30

मैंइंडेक्स पर आधारित LinkedHashMap से मूल्य कैसे प्राप्त करें?

LinkedHashMap<String, List<String>> hMap; 

मैं स्थिति कुंजी पर नहीं द्वारा List<String> प्राप्त करना चाहते है।

मैं iterate का उपयोग नहीं करना चाहता।

क्या सूचकांक पर आधारित मूल्य प्राप्त करने का कोई अन्य तरीका है?

+2

यदि आप स्वयं द्वारा यह डेटा संरचना चुनते हैं तो शायद यह इस कार्य के लिए सबसे अच्छा नहीं है। –

+0

@ निकोलय कुज़नेत्सोव: क्या आप मुझे बता सकते हैं कि यह कैसे होना चाहिए? – MAC

+0

ArrayList यदि आप केवल सूचकांक –

उत्तर

41

आप सूचकांक के आधार पर Map का मूल्य नहीं मिल सकता है, Map रों सिर्फ इतना है कि जिस तरह से काम नहीं करते। एक वर्कअराउंड आपके मूल्यों से एक नई सूची बनाने और सूचकांक के आधार पर मूल्य प्राप्त करना होगा।

LinkedHashMap<String, List<String>> hMap; 
List<List<String>> l = new ArrayList<List<String>>(hMap.values()); 
l.get(0); 
+2

यदि मैं इंडेक्स के आधार पर मूल्य सम्मिलित करना चाहता हूं? इसे कैसे प्राप्त करें? –

+1

यहां एक उत्तर है जिसे मैंने किसी भी तरह पोस्ट किया है, मैं इसे यहां पोस्ट नहीं कर सकता, यह थ्रेड लॉक है: http://stackoverflow.com/a/31749969/961018 – momomo

13
public List<String> getByIndex(LinkedHashMap<String, List<String>> hMap, int index){ 
    return (List<String>) hMap.values().toArray()[index]; 
} 
9

आप या तो किसी अन्य वर्ग का उपयोग कर अपने डेटा स्टोर, या LinkedHashMap के लिए एक विस्तार लिखने के लिए विचार कर सकते हैं।

//this is pseudo code 
public class IndexedLinkedHashMap<K,V> extends LinkedHashMap{ 

HashMap<int,K> index; 
int curr = 0; 

    @Override 
    public void add(K key,V val){ 
     super.add(key,val); 
     index.add(curr++, key); 
    } 

    public V getindexed(int i){ 
     return super.get(index.get(i)); 
    } 

} 
3

इंडेक्स किए गए मानचित्र प्रदान करने के लिए मानक जावा संग्रह API में कोई प्रत्यक्ष डीएस नहीं है। हालांकि, निम्नलिखित आप परिणाम प्राप्त देना चाहिए:

// An ordered map 
Map<K, V> map = new LinkedHashMap<K, V>(); 
// To create indexed list, copy the references into an ArrayList (backed by an array) 
List<Entry<K, V>> indexedList = new ArrayList<Map.Entry<K, V>>(map.entrySet()); 
// Get the i'th term 
<Map.Entry<K,V>> entry = indexedList.get(index); 
K key = entry.getKey(); 
V value = entry.getValue(); 

तुम अब भी नक्शा पुनः प्राप्ति से अलग में डेटा हठ की चिंताओं को बनाए रखने के लिए चाहते हो सकता है।

अद्यतन: या अपाचे कॉमन्स से LinkedMap का उपयोग करें।

5

के रूप में केविन बोवेरसोक्स कहा गया है, यह उतना ही आसान

List<String> result = (List<String>) hMap.values().toArray()[position]; 

के रूप में है लेकिन यह ध्यान दिया जाना चाहिए कि यह अभी भी .toArray का उपयोग करके पुनरावृति होगा()। यह एक साधारण कथन है और मुझे यकीन नहीं है कि बेहतर प्रदर्शन के साथ कोई है, लेकिन ध्यान रखें कि जटिलता लॉग नहीं है (एन) (बी * के मामले में अनुक्रमित पहुंच की तरह), लेकिन सिर्फ n। चूंकि LinkedHashMap LinkedList पर आधारित है, इसलिए अनुक्रमिक क्रम में केवल तत्वों को यादृच्छिक रूप से एक्सेस करने का कोई तरीका नहीं है।

सूची में कलाकार एक अपरिहार्य बुराई है, क्योंकि .toArray() एक सामान्य डेटा प्रकार के बजाय ऑब्जेक्ट लौटने की पुरातन अवधारणा का पालन करता है।

हालांकि यह मानचित्र की मुख्य अवधारणा नहीं हो सकता है, LinkedHashMap सिर्फ एक मानचित्र नहीं है। यह हैश मैप बढ़ाता है, और एक विस्तारित वर्ग के रूप में, उस वर्ग की मूर्खता का समर्थन करने वाले अतिरिक्त तरीकों को लाने के लिए यह बिल्कुल ठीक है।

+0

एक नया सरणी बनाएं ..बहुत सुंदर नहीं – momomo

+1

यहां एक उत्तर है जिसे मैंने किसी भी तरह पोस्ट किया है, मैं इसे यहां पोस्ट नहीं कर सकता, यह थ्रेड लॉक है: http://stackoverflow.com/a/31749969/961018 – momomo

+0

@momo मेरी पोस्ट बस व्याख्या करने के लिए थी कि केविन बोवर्सॉक्स प्रस्तावित करता है कि पुनरावृत्ति से बचें और इसके अलावा ऐसा कोई रास्ता नहीं है। मूल्यों को मैन्युअल रूप से पुन: स्थापित करके सरणी का निर्माण आसानी से टाला जा सकता है, लेकिन यह आदर्श जवाब नहीं है जब सवाल यह है कि बिना किसी पुनरावृत्ति के इसे कैसे किया जाए। जाहिर है आप एक अलग इंडेक्सिंग अवधारणा के साथ अपने स्वयं के कार्यान्वयन बनाकर इससे बच सकते हैं, लेकिन यह सवाल से असंबंधित लगता है। – makrom

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