2012-12-08 19 views
5

मैं जावा में नया हूं और मैं हैश टेबल के बारे में जानने की कोशिश कर रहा हूं। मैं अपनी हैश तालिका में ऑब्जेक्ट्स डालना चाहता हूं और फिर अंत में हैश तालिका से सभी ऑब्जेक्ट्स प्रिंट करने में सक्षम हूं। मुझे यकीन नहीं है कि मैं यह सही कर रहा हूं क्योंकि मैंने पढ़ा है कि मुझे get() विधि या हैशकोड() विधि को ओवरराइड करने की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि क्यों।हैश टेबल जावा डालने

मैं छात्र नामों की स्ट्रिंग ऑब्जेक्ट्स में गुजर रहा हूं। जब मैं अपने आवेषण के बाद डीबगर चलाता हूं, तो यह कुंजी को "शून्य" के रूप में दिखाता है और मेरे आवेषण की अनुक्रमणिका हैश तालिका में यादृच्छिक स्थानों पर होती है। पूर्व। 1, 6, 10

इस प्रकार मैं जोड़ रहा हूं। क्या कोई मुझे बता सकता है कि यह सही है और क्या मुझे वास्तव में चीजों को ओवरराइड करने की ज़रूरत है?

अग्रिम धन्यवाद!

कोड

Hashtable<String,String> hashTable=new Hashtable<String,String>(); 
hashTable.put("Donald", "Trump"); 
hashTable.put("Mike", "Myers"); 
hashTable.put ("Jimmer", "Markus"); 
+0

यह ठीक लग रहा है। डीबगर में आपका क्या देख रहा है बैकिंग सरणी के नट-किरकिरा कार्यान्वयन विवरण और इसी तरह। आप वास्तव में ऐसा नहीं मानते हैं कि जब तक आप उत्सुक न हों। त्वरित उत्तर के लिए –

+0

@ ग्रेग्स धन्यवाद ग्रेग। अगर मैंने केवल एक स्ट्रिंग ऑब्जेक्ट के बजाय सम्मिलित करने के लिए छात्र ऑब्जेक्ट का उपयोग किया है, तो क्या मुझे चीजों को ओवरराइड करना होगा? क्या आप मुझे दिखाते हैं कि मैं ऐसी चीज कैसे कार्यान्वित कर सकता हूं? आपकी मदद के लिए आपको और हर किसी के लिए धन्यवाद –

उत्तर

4

आप चीजों को सही ढंग से कर रहे हैं। याद रखें, Hashtable प्रत्यक्ष-पहुंच संरचना नहीं है। उदाहरण के लिए, आप "Hashtable से तीसरा आइटम नहीं प्राप्त कर सकते"। जब आप Hashtable के बारे में बात कर रहे हों तो "इंडेक्स" शब्द का कोई वास्तविक अर्थ नहीं है: वस्तुओं की संख्यात्मक अनुक्रमणिका का मतलब कुछ भी नहीं है।

एक Hashtable गारंटी देता है कि यह आप के लिए कुंजी-मान जोड़ों का आयोजन करेगा एक तरीका है कि यह हो जाएगा में, बहुत (उदाहरण के लिए एक महत्वपूर्ण आधार पर एक मूल्य के समाप्त करने के लिए तेजी से: Donald दिया, आप Trump बहुत जल्दी मिल जाएगा)। बेशक, इसके लिए सही काम करने के लिए कुछ शर्तों को पूरा करना होगा, लेकिन आपके सरल स्ट्रिंग-टू-स्ट्रिंग उदाहरण के लिए, यह काम करता है।

आपको सामान्य रूप से हैश टेबल के बारे में अधिक पढ़ना चाहिए, यह देखने के लिए कि वे वास्तव में दृश्यों के पीछे कैसे काम करते हैं।

EDIT (ओपी के अनुरोध के अनुसार): आप अपने हैशटेबल में Student उदाहरणों को संग्रहीत करने के बारे में पूछ रहे हैं। जैसा कि मैंने ऊपर बताया है, कुछ स्थितियों को हैशटेबल के लिए सही ढंग से काम करने के लिए संबोधित किया जाना चाहिए। उन स्थितियों कुंजी भाग से संबंधित हैं, मूल्य भाग नहीं है।

अपने Student उदाहरण मूल्य है, और एक सरल स्ट्रिंग कुंजी है, तो वहाँ कुछ खास नहीं है तुम क्या करने के लिए, स्ट्रिंग आदिम पहले से ही एक उचित Hashtable कुंजी के लिए आवश्यक शर्तों के सभी का जवाब देता है।

यदि आपका Student उदाहरण कुंजी है, तो निम्न शर्तें पूरी होनी चाहिए:

  1. Student के अंदर, आप इस तरह से कि hashCode के बाद आमंत्रण वास्तव में वापस आ जाएगी में hashCode विधि ओवरराइड चाहिए वही मूल्य दूसरे शब्दों में, अभिव्यक्ति x.hashCode() == x.hashCode()हमेशा सत्य होना चाहिए।

  2. Student के अंदर, आप इस तरह से है कि यह केवल Student के दो समान उदाहरण के लिए true वापस आ जाएगी में equals विधि ओवरराइड, और false अन्यथा लौट जाना चाहिए।

ये शर्तें उचित हैंशटेबल कुंजी के रूप में कार्य करने के लिए Student के लिए पर्याप्त हैं। आप बेहतर hashCode कार्यान्वयन लिखकर चीजों को और अनुकूलित कर सकते हैं (इसके बारे में पढ़ें ... यहां टाइप करना काफी लंबा है), लेकिन जब तक आप उपर्युक्त दो का जवाब देते हैं, तो आप जाने के लिए अच्छे हैं।

उदाहरण:

class Student { 
    private String name; 
    private String address; 

    public int hashCode() { 
     // Assuming 'name' and 'address' are not null, for simplification here. 

     return name.hashCode() + address.hashCode(); 
    } 

    public boolean equals (Object other) { 
     if (!(other instanceof Student) { 
      return false; 
     } 
     if (other == this) { 
      return true; 
     } 

     Student otherStudent = (Student) other; 
     return name.equals(otherStudent.name) && address.equals(otherStudent.address); 
    } 
} 
+0

क्षमा करें एक आखिरी सवाल ... चूंकि मैं ओवरराइड कर रहा हूं, मुझे "@" का उपयोग करने की आवश्यकता नहीं है? एक बार फिर धन्यवाद! –

+1

हां, आप '@ ओवरराइड 'का उपयोग कर सकते हैं। वास्तव में यह सिफारिश की जाती है कि आप करते हैं। मैं केवल यहाँ सरल था। – Isaac

0

इस कोड का प्रयास करें:

Hashtable<String,String> hashTable=new Hashtable<String,String>(); 

hashTable.put("Donald", "16 years old"); 
hashTable.put("Mike", "20 years old"); 
hashTable.put ("Jimmer", "18 years old"); 

Enumeration studentsNames; 
String str; 


// Show all students in hash table. 
studentsNames = hashTable.keys(); 
while(studentsNames.hasMoreElements()) { 
str = (String) studentsNames.nextElement(); 
txt.append("\n"+str + ": " + hashTable.get(str)); 
}