2013-02-23 90 views
6

मुझे लगता है कि मेरा प्रश्न काफी सरल है, हालांकि मुझे समाधान नहीं मिला, इसलिए मैंने यहां पूछने का फैसला किया। क्या मैं जरूरत है इस तरह एक कस्टम कुंजी प्रकार के साथ एक HashMap बनाना है:जावा हैश मैप को कस्टम कुंजी प्रकार के साथ कैसे ठीक से काम करने के लिए?

HashMap<Pair<Integer, Integer>, StrategyPoint> myMap = new HashMap<Pair<Integer, Integer>, StrategyPoint>(); 

हालांकि मैं कुछ यहाँ याद आ रही है, क्योंकि HashMap ठीक से काम करना बंद कर देता। सबसे पहले कुंजी अनूठी नहीं होती है और समान मूल्य वाले जोड़े के अलग-अलग उदाहरण कुंजीसेट में पाए जा सकते हैं। इसके अलावा इसमें मुख्य फ़ंक्शन काम नहीं करता है जिस तरह से मुझे लगता है :)। मैं स्पष्ट रूप से कुछ याद करता हूं और अधिक संभावना है कि मुझे किसी भी तरह से अपने जोड़े वर्ग से अपने उदाहरणों की तुलना करने के तरीके को परिभाषित करना चाहिए। हालांकि मैंने तुलनात्मक रूप से तुलना करने की कोशिश की तुलना में मेरी जोड़ी कक्षा में और यह अभी भी काम नहीं करता है। कोई सुझाव?

मेरा मूल कोड थोड़े गन्दा और पढ़ने के लिए असभ्य है, इसलिए मैंने यहां अपनी समस्या को स्पष्ट करने के लिए एक उदाहरण बनाया है।

HashMap<Pair<Integer, Integer>, StrategyPoint> myMap = new HashMap<Pair<Integer, Integer>, StrategyPoint>(); 
    Pair<Integer, Integer> myPair = new Pair<Integer, Integer>(2,2); 
    StrategyPoint myPoint= new StrategyPoint(2, 2, 5, 5, false); 
    myMap.put(myPair, myPoint); 


    Pair<Integer, Integer> searcher = new Pair<Integer, Integer> (0,0); 
    searcher.setFirst(2); 
    searcher.setSecond(2); 
    System.out.println(myMap.containsKey(searcher)); 
    System.out.println(myMap.containsKey(myPair)); 

निष्पादन से परिणाम है::

झूठी

सच

मैं डिबग यह और खोजकर्ता उदाहरण ठीक से आबादी beeing है है, लेकिन यह HashMap लगता है यहाँ कोड है इसे अपने कीसेट में ढूंढने से इंकार कर दिया।

मदद लोगों के लिए धन्यवाद!

उत्तर

12

आपको और hashCodePair कक्षा पर ठीक से लागू करना होगा।

HashMap इन विधियों को अलग-अलग करने और कुंजी वर्ग को हैश करने के लिए उपयोग करता है।

+3

प्रत्येक जावा शुरुआती, जल्द ही या बाद में, बराबर/हैशकोड मुद्दे का सामना करेगा! – gd1

+0

मुझे इसकी एक मानक समस्या पता था। धन्यवाद यह कोशिश करेंगे! –

+0

@ gd1 बिंदु पर !!! –

2

Object के लिए जावाडोक में निर्दिष्ट अनुबंध के अनुसार आपके जोड़े वर्ग को hashCode() और equals() लागू करने की आवश्यकता है।

5

आपको कक्षा Pair में equals ओवरराइड करने की आवश्यकता है। इस विधि का कार्यान्वयन परिभाषित करता है कि Pair की दो वस्तुओं को बराबर माना जाता है।

और जब भी आप equals ओवरराइड करते हैं तो आपको हमेशा hashcode ओवरराइड करना होगा।

यहाँ क्या गलत हो सकता है जब आप equals पर हावी नहीं लेकिन hashcode है (प्रभावी जावा, दूसरा एड से।):

दो अलग उदाहरणों एक वर्ग के के बराबर होती है विधि के अनुसार तार्किक बराबर हो सकता है, लेकिन करने के लिए ऑब्जेक्ट की हैशकोड विधि, वे केवल दो ऑब्जेक्ट्स हैं जिनमें कुछ भी सामान्य नहीं है। इसलिए ऑब्जेक्ट की हैशकोड विधि अनुबंध के अनुसार आवश्यक दो बराबर संख्याओं की बजाय दो प्रतीत होता है यादृच्छिक संख्या देता है।

क्योंकि दो तार्किक बराबर उदाहरण के लिए hashcodes, असमान बन अगर आप एक के लिए खोज करने के लिए, जबकि एक अन्य संग्रह में है की कोशिश, आप गलत हैश बाल्टी जो null में जो परिणाम में देख खत्म हो जाएगा।

rules का एक सेट है जो equals के कार्यान्वयन के अनुरूप होना चाहिए। hashcode ओवरराइड करने के लिए rules का एक और सेट।

+0

-1: आपका उत्तर देर हो चुकी है, और अपूर्ण है। दो अन्य पहले से ही सही हैं। –

+4

देर कम उपयोगी नहीं है। –

+1

डाउनवोट के समय, आप पूरी तरह से हैशकोड के बारे में भूल गए, जिसने आपका उत्तर सादा गलत बना दिया (और इस प्रकार उपयोगी नहीं)। इतिहास को फिर से लिखने की कोशिश मत करो। मैंने अपना डाउनवोट हटा दिया, क्योंकि जवाब अब तय हो गया है। –