आप चीजों को सही ढंग से कर रहे हैं। याद रखें, Hashtable
प्रत्यक्ष-पहुंच संरचना नहीं है। उदाहरण के लिए, आप "Hashtable
से तीसरा आइटम नहीं प्राप्त कर सकते"। जब आप Hashtable
के बारे में बात कर रहे हों तो "इंडेक्स" शब्द का कोई वास्तविक अर्थ नहीं है: वस्तुओं की संख्यात्मक अनुक्रमणिका का मतलब कुछ भी नहीं है।
एक Hashtable
गारंटी देता है कि यह आप के लिए कुंजी-मान जोड़ों का आयोजन करेगा एक तरीका है कि यह हो जाएगा में, बहुत (उदाहरण के लिए एक महत्वपूर्ण आधार पर एक मूल्य के समाप्त करने के लिए तेजी से: Donald
दिया, आप Trump
बहुत जल्दी मिल जाएगा)। बेशक, इसके लिए सही काम करने के लिए कुछ शर्तों को पूरा करना होगा, लेकिन आपके सरल स्ट्रिंग-टू-स्ट्रिंग उदाहरण के लिए, यह काम करता है।
आपको सामान्य रूप से हैश टेबल के बारे में अधिक पढ़ना चाहिए, यह देखने के लिए कि वे वास्तव में दृश्यों के पीछे कैसे काम करते हैं।
EDIT (ओपी के अनुरोध के अनुसार): आप अपने हैशटेबल में Student
उदाहरणों को संग्रहीत करने के बारे में पूछ रहे हैं। जैसा कि मैंने ऊपर बताया है, कुछ स्थितियों को हैशटेबल के लिए सही ढंग से काम करने के लिए संबोधित किया जाना चाहिए। उन स्थितियों कुंजी भाग से संबंधित हैं, मूल्य भाग नहीं है।
अपने Student
उदाहरण मूल्य है, और एक सरल स्ट्रिंग कुंजी है, तो वहाँ कुछ खास नहीं है तुम क्या करने के लिए, स्ट्रिंग आदिम पहले से ही एक उचित Hashtable कुंजी के लिए आवश्यक शर्तों के सभी का जवाब देता है।
यदि आपका Student
उदाहरण कुंजी है, तो निम्न शर्तें पूरी होनी चाहिए:
Student
के अंदर, आप इस तरह से कि hashCode
के बाद आमंत्रण वास्तव में वापस आ जाएगी में hashCode
विधि ओवरराइड चाहिए वही मूल्य दूसरे शब्दों में, अभिव्यक्ति x.hashCode() == x.hashCode()
हमेशा सत्य होना चाहिए।
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);
}
}
यह ठीक लग रहा है। डीबगर में आपका क्या देख रहा है बैकिंग सरणी के नट-किरकिरा कार्यान्वयन विवरण और इसी तरह। आप वास्तव में ऐसा नहीं मानते हैं कि जब तक आप उत्सुक न हों। त्वरित उत्तर के लिए –
@ ग्रेग्स धन्यवाद ग्रेग। अगर मैंने केवल एक स्ट्रिंग ऑब्जेक्ट के बजाय सम्मिलित करने के लिए छात्र ऑब्जेक्ट का उपयोग किया है, तो क्या मुझे चीजों को ओवरराइड करना होगा? क्या आप मुझे दिखाते हैं कि मैं ऐसी चीज कैसे कार्यान्वित कर सकता हूं? आपकी मदद के लिए आपको और हर किसी के लिए धन्यवाद –