2009-09-14 16 views
19

में तत्वों का क्रम कैसे रखें मेरे पास हैशटेबल है। मान() विधि कुछ क्रम में मूल्यों को अलग करता है जिसमें मुझे सम्मिलित किया जाता है। मैं मूल्यों को उसी क्रम में कैसे प्राप्त कर सकता हूं जैसा मैंने डाला था? LinkedHashmap का उपयोग करना एक विकल्प है लेकिन यह सिंक्रनाइज़ नहीं है।हैशटेबल

+0

कौन सी भाषा का प्रयोग कर रहे हैं तो? –

+0

LinkedHashMap जावा का एक हिस्सा है। – jimyi

+0

मैं जावा का उपयोग कर रहा हूँ। जेडीके 1.6 –

उत्तर

31

LinkedHashMap का उपयोग करें।

उम्मीद के मुताबिक यात्रा आदेश के साथ

हैश तालिका और Map इंटरफ़ेस का लिंक्ड सूची कार्यान्वयन, । यह कार्यान्वयन HashMap से में भिन्न है कि यह एक दोगुनी-लिंक्ड सूची अपनी सभी प्रविष्टियों के माध्यम से चल रहा है। यह लिंक्ड सूची पुनरावृत्ति ऑर्डरिंग को परिभाषित करती है, जो आमतौर पर ऑर्डर होती है जिसमें मानचित्र (सम्मिलन-आदेश) में कुंजियां डाली गई थीं। ध्यान दें कि प्रविष्टि आदेश प्रभावित नहीं होता है यदि कुंजी मानचित्र में फिर से डाला गया है। (ए कुंजी कश्मीर एक नक्शे के मीटर में अगर m.put(k, v) शुरू हो जाती है जब m.containsKey(k)true तुरंत पहले मंगलाचरण में हो जाएंगे पुनः लगाए।)

Collections.synchronizedMap() के साथ संयुक्त।

तो, उदाहरण के लिए:

Map<String, String> map = Collections.synchronizedMap(
    new LinkedHashMap<String, String>()); 
+0

स्पष्टीकरण के लिए: यदि मैं एक समय में इस 'लिंक्ड हैशमैप' को 1 ट्रेड तक पहुंचने की सोच नहीं रहा हूं, तो क्या इसे अभी भी सिंक्रनाइज़ करने की अनुशंसा की जाएगी? या 'लिंक्ड हैश मैप' अपने आप पर पर्याप्त माना जाएगा? – blo0p3r

+1

@ blo0p3r 'LinedHashMap' अपने आप पर पर्याप्त होना चाहिए। –

1

एक हैश तालिका स्वाभाविक रूप से अनियंत्रित है, इसलिए आप गलत डेटा संरचना का उपयोग कर रहे हैं। चूंकि आप यह निर्दिष्ट नहीं करते कि आप किस भाषा का उपयोग कर रहे हैं, मैं वैकल्पिक विकल्प का सुझाव नहीं दे सकता, लेकिन आपको किसी प्रकार की ऑर्डर की गई कुंजी/मान सेट की आवश्यकता है।

+0

मैं जावा का उपयोग कर रहा हूं। जेडीके 1.6 –

2

मैं बहुत यकीन है कि कारण hashtables अवर्गीकृत हैं भंडारण और पुनर्प्राप्ति गति सहायता करने के लिए है हूँ। इस वजह से मैं आदेश को बनाए रखने के लिए बाहरी संरचना का उपयोग करने और मूल्यों को संग्रहित करने के लिए हैशटेबल का उपयोग करने का सुझाव दूंगा (तेज़ लुकअप के लिए)।

4

आप या तो एक LinkedHashMap लपेट और सिंक्रनाइज़ या आप Collections.synchronizedMap उपयोगिता का उपयोग बनाने के लिए कर सकती एक तुल्यकालन LinkedHashMap:

Map m = Collections.synchronizedMap(new LinkedHashMap(...)); 

JavaDoc से:

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

+0

बहुत बहुत धन्यवाद .. लेकिन क्या यह एक प्रदर्शन हिट होगा? –

+0

प्रदर्शन ओवरहेड लापरवाही (शाब्दिक रूप से नैनोसेकंड) होगा। – Adamski

1

तो jdk1.6 आप आदेश दिया मानचित्र EnumMap और LinkedHashMap के केवल दो प्रकार के लिए आकस्मिक अनसिंक्रनाइज़्ड पहुँच को रोकने के निर्माण के समय पर किया जाता है,। उनमें से दोनों सिंक्रनाइज़ नहीं हैं।तुम सिर्फ आदेश को याद करने की जरूरत है,

Map m = Collections.synchronizedMap(new LinkedHashMap(...)); 

का उपयोग आप क्रमबद्ध तो का उपयोग ConcurrentSkipListMap

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