2008-08-27 21 views
7

जावा में हैश तालिका (या सहयोगी सरणी ...) बनाने का सबसे सरल तरीका क्या है? मेरे google-fu ने कुछ उदाहरण सामने कर दिए हैं, लेकिन क्या ऐसा करने का एक मानक तरीका है?मैं जावा में हैश टेबल कैसे बना सकता हूं?

और क्या प्रत्येक जोड़ी के लिए ऑब्जेक्ट पर एक अतिरिक्त विधि को कॉल किए बिना कुंजी-> मूल्य जोड़े की सूची के साथ तालिका को पॉप्युलेट करने का कोई तरीका है?

उत्तर

23
Map map = new HashMap(); 
Hashtable ht = new Hashtable(); 
दोनों वर्गों

java.util पैकेज से पाया जा सकता है। 2 के बीच का अंतर निम्नलिखित jGuru FAQ entry में समझाया गया है।

+1

+1, आप हैशटेबल और हैश मैप दोनों का उल्लेख करते हैं। – bgw

+0

jGuru प्रविष्टि से: "दोनों के बीच महत्वपूर्ण अंतर यह है कि हैशटेबल तक पहुंच है, जबकि हैश मैप तक पहुंच सिंक्रनाइज़ होती है। आप इसे जोड़ सकते हैं, लेकिन यह डिफ़ॉल्ट रूप से नहीं है। दूसरा अंतर यह है कि हैश मैप में इटरेटर असफल-सुरक्षित है जबकि हैशटेबल के लिए गणनाकर्ता नहीं है। अगर आप पुनरावृत्ति करते समय मानचित्र बदलते हैं, तो आपको पता चलेगा। " – ErikAGriffin

2
import java.util.HashMap; 

Map map = new HashMap(); 
1

Edmund ने कहा।

कॉल करने के लिए नहीं। हर समय, नहीं, मूर्खता से नहीं। विभिन्न हैक (इसे एक सरणी में संग्रहित करना और फिर लूपिंग) होगा जो आप वास्तव में करना चाहते हैं, लेकिन मैं इसकी अनुशंसा नहीं करता।

7

यह भी न भूलें कि नक्शा और हैशटेबल जावा 5 और ऊपर दोनों में सामान्य हैं (जैसा कि Collections framework में किसी भी अन्य वर्ग में)।

Map<String, Integer> numbers = new HashMap<String, Integer>(); 
numbers.put("one", 1); 
numbers.put("two", 2); 
numbers.put("three", 3); 

Integer one = numbers.get("one"); 
Assert.assertEquals(1, one); 
0

और वहाँ व्यक्तिगत रूप से प्रत्येक जोड़ी के लिए वस्तु पर एक ऐड विधि बुला बिना कुंजी> मान युग्म की सूची के साथ तालिका पॉप्युलेट करने के लिए एक तरीका है?

आपके प्रश्न के साथ एक समस्या यह है कि आप यह नहीं बताते कि आपका डेटा किस प्रकार से शुरू होता है। यदि आपकी जोड़ों की सूची मानचित्र की सूची बन गई है। एंटर्री ऑब्जेक्ट्स यह बहुत आसान होगा।

बस इसे बाहर फेंकने के लिए, जावा (यूटिल.प्रॉपर्टीज नामक एक (बहुत बदनाम) वर्ग है जो हैशटेबल का विस्तार है। यह केवल स्ट्रिंग कुंजी और मानों की अपेक्षा करता है और आपको फ़ाइलों या स्ट्रीम का उपयोग करके डेटा लोड और स्टोर करने देता है। फ़ाइल यह रीड और राईट का स्वरूप इस प्रकार है:

key1=value1 
key2=value2 

यदि यह आपके लिए क्या देख रहे हैं मैं नहीं जानता, लेकिन वहाँ स्थितियों में, जहां इस उपयोगी हो सकते हैं।

19

आप डेटा सेट अप करने के लिए डबल ब्रेसिज़ का उपयोग कर सकते हैं। आप अभी भी जोड़ते हैं, या डालते हैं, लेकिन यह कम बदसूरत है:

private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() {{ 
    put("foo",  1); 
    put("bar",  256); 
    put("data",  3); 
    put("moredata", 27); 
    put("hello", 32); 
    put("world", 65536); 
}}; 
+1

आपके चर प्रकार को वास्तव में 'मानचित्र' होना चाहिए। 'मानचित्र <स्ट्रिंग, इंटीजर> MYHASH = नया हैशटेबल <स्ट्रिंग, इंटीजर>()' –

0

यह ध्यान रखना महत्वपूर्ण है कि जावा का हैश फ़ंक्शन इष्टतम से कम है। आप कम टकराव और ~ पर 50% क्षमता फिर से हैशिंग का लगभग पूरा उन्मूलन चाहते हैं, मैं एक Buz हैश एल्गोरिदम Buz Hash

कारण जावा के हैशिंग एल्गोरिथ्म कमजोर है कि यह कैसे स्ट्रिंग्स हैश में सबसे स्पष्ट है का उपयोग करेंगे।

"a".hash() आप "a" की ASCII प्रतिनिधित्व देना - 97, तो "b"98 होगा। हैशिंग का पूरा बिंदु मनमाने ढंग से और "यथासंभव यादृच्छिक" संख्या असाइन करना है।

यदि आपको त्वरित और गंदे हैश तालिका की आवश्यकता है, तो हर तरह से, java.util का उपयोग करें। यदि आप कुछ मजबूत खोज रहे हैं जो अधिक स्केलेबल है, तो मैं खुद को लागू करने में देखता हूं।

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