java - HashMap and Hashcode -


आदर्श रूप से, परिभाषा के अनुसार, हैशमैप डुप्लिकेट की अनुमति नहीं देता; लेकिन मैं निम्न तर्क को समझ नहीं सका।

मैंने कर्मचारी वर्ग को परिभाषित किया है और बराबर और हैशोड को ओवरराइड कर दिया है विधियों।

  सार्वजनिक वर्ग कर्मचारी {निजी स्ट्रिंग empID; सार्वजनिक एक्ट हैशोड () {इंट परिणाम = 17; परिणाम = 37 * परिणाम + empID.hashCode (); वापसी परिणाम; } सार्वजनिक बूलियन बराबर (वस्तु ऑब्जेक्ट) {बूलियन परिणाम = गलत; यदि (वस्तु का उदाहरण कर्मचारी) {कर्मचारी कर्मचारी = (कर्मचारी) वस्तु; परिणाम = (this.empID.equalsIgnoreCase (employee.getEmpID ())); } वापसी परिणाम; }} कर्मचारी e1 = नया कर्मचारी ("1"); कर्मचारी ई 2 = नया कर्मचारी ("2"); मानचित्र & lt; कर्मचारी, स्ट्रिंग & gt; EmpMap = नया हैशमैप & lt; कर्मचारी, स्ट्रिंग & gt; (); EmpMap.put (e1, "Emp1"); EmpMap.put (e2, "Emp2"); सेट करें & lt; कर्मचारी & gt; कुंजी = empMap.keySet (); (कर्मचारी ई: कुंजी के लिए) {ई.से.एफ़एफ़आईडीआईडी ​​("1"); } के लिए (कर्मचारी ई: कुंजी) {System.out.println (e.getEmpID ()); Println (e.hashCode ()); } System.out.println (empMap.get (नया कर्मचारी ("1")));  

मुझे हमेशा मान मिल रहा है Emp1 । कैसे मान प्राप्त करें Emp2 ?

मेरा मानना ​​है कि आपकी चाबियाँ हैं और पीछे की ओर मूल्य आपको अपने स्ट्रिंग को कुंजी के रूप में और अपने कर्मचारी वर्ग को मूल्य के रूप में उपयोग करना चाहिए:

  मानचित्र & lt; स्ट्रिंग, कर्मचारी & gt; EmpMap = नया हैशमैप & lt; & gt; (); EmpMap.put ("Emp1", e1); EmpMap.put ("Emp2", e2);  

तब आपके कर्मचारी वर्ग को हैशोड की आवश्यकता नहीं है और सभी के तरीकों के बराबर है आपका कर्मचारी वर्ग मानचित्र कुंजी के रूप में उपयोग के लिए उपयुक्त नहीं है, मुख्यतः क्योंकि चाबियाँ उनके आंतरिक चर को बदलने में नहीं होती हैं इसका कारण यह है कि आप केवल एक आईडी देखते हैं, इसके कारण:

  के लिए (कर्मचारी ई: कुंजी) {e.setEmpID ("1"); }  

यह तीन कारणों से टूट गया है (1) मानचित्र में एक कुंजी के वैरिएबल को संशोधित नहीं करना चाहिए, क्योंकि नक्शा इसके बारे में नहीं पता होगा। किसी मान से जुड़े कुंजी को बदलने के लिए, आपको को हटा दें () मानचित्र से मैपिंग करना होगा, और put () वापस नई कुंजी के साथ। (2) मानचित्र को संशोधित करने की अनुमति नहीं दी जाएगी, यदि आप एक साथ नक्शे पर फिर से चल रहे हैं (जब तक कि आप इसे नक्शे के इटरेटर के माध्यम से नहीं करते हैं)। (3) आप सभी कर्मचारियों को एक ही कुंजी दे रहे हैं, इसलिए नक्शा उन्हें अलग नहीं बता सकता।

अपने कर्मचारी वर्ग के उद्देश्य के बारे में सोचें यदि आप वास्तव में इसे एक मानचित्र कुंजी के रूप में उपयोग करना चाहते हैं, तो आईडी के लिए सेटर निकालें, क्योंकि यह हमेशा उस विधि का उपयोग करने में गलत होगा। एक आदर्श मानचित्र कुंजी पूरी तरह से अपरिवर्तनीय और अंतिम है समानता का उपयोग करने के लिए बराबर भी है IgnoreCase बराबर विधि में, क्योंकि तब बराबर विधि हैशोड विधि के अनुरूप नहीं है। (यदि a.equals (b) सच है तो यह आवश्यक है कि a.hashCode () == b.hashCode () , या नक्शा ठीक से काम नहीं करेगा। ) जब तक आप अपने कर्मचारी वर्ग को मानचित्र कुंजी के रूप में इस्तेमाल करने के लिए फिक्स करना चाहते हैं, यह स्ट्रिंग के आसपास सिर्फ एक परेशानी और अनावश्यक आवरण है, लेकिन फिर आपके पास कोई अन्य कर्मचारी जानकारी रखने की कोई जगह नहीं है, यही कारण है कि मैं केवल चाबियां और मूल्य, जो आपके सभी समस्याओं को एक-एक में हल करेंगे।


Comments

Popular posts from this blog

sqlite3 - UPDATE a table from the SELECT of another one -

c# - Showing a SelectedItem's Property -

javascript - Render HTML after each iteration in loop -