2012-05-26 18 views
5

काम नहीं करता है मैं यहां और अन्य साइटों पर बहुत सारे प्रश्न ब्राउज़ कर रहा हूं। फिर भी मैं इस समस्या के चारों ओर अपने सिर को लपेटने के लिए प्रतीत नहीं कर सकता।बराबर विधि को ओवरराइड करना

मैं एक वर्ग है:

public class Event { 
    public String Item; 
    public String Title; 
    public String Desc; 

    @Override 
    public boolean equals(Object o) { 
      return true; 
    } 
} 

मैं एक ArrayList<Event> events में इस वर्ग का उपयोग करने की कोशिश कर रहा हूँ, लेकिन मैं events.contains("item") काम करने के लिए प्राप्त करने के लिए एक तरह से नहीं मिल रहा। मैंने डीबगिंग करने का प्रयास किया है और मैंने पाया है कि यह ओवरराइड विधि भी दर्ज नहीं करता है।

मैं क्या गलत कर रहा हूं?

+2

आपकी सूची में 'ईवेंट' है, फिर भी आप एक स्ट्रिंग के साथ 'युक्त' कॉल कर रहे हैं। क्या मैं कुछ भूल रहा हूँ? – Tudor

+1

कृपया वह कोड दिखाएं जहां आप सूची पॉप्युलेट कर रहे हैं और 'शामिल' को कॉल कर रहे हैं। – Tudor

उत्तर

7

क्योंकि आप equals() की specified in the contract के रूप में समरूपता को तोड़ने रहे हैं यही कारण है कि: यदि किसी भी घटना "item" (जो एक स्ट्रिंग है) करने के लिए बराबर है, "item" भी किसी भी घटना के लिए बराबर होना चाहिए।

वास्तव में, जावा आपकी सूची में indexOf("item") पर कॉल करने के लिए क्या करता है, और जांचें कि यह सकारात्मक है या नहीं।

अब, उदाहरण के लिए एक ArrayList में इस तरह काम करता है indexOf() (complete source code here देखें):

for (int i = 0; i < size; i++) 
     if ("item".equals(elementData[i])) 
      return i; 

तो मूल रूप से यह String's equals() विधि है जो यहाँ कहा जाता है, अपने एक नहीं जो निश्चित रूप से झूठी लौट रहा है।

बस की तरह है, कार्य करने के लिए एक Event पैरामीटर निर्दिष्ट द्वारा इस मुद्दे का समाधान:

events.contains(new Event("item", "title", "desc")) 

नोट आप होगा कि अपने वर्ग OT सदस्यों को प्रारंभ करने के लिए एक उचित निर्माता बनाने के लिए।

+0

तब मैं इसे कैसे हल कर सकता हूं? – CornflakesDK

+1

अंत में एक अच्छा जवाब। पूर्णता के लिए आप 'ArrayList.contains' के स्रोत कोड से लिंक और/या पोस्ट कर सकते हैं: http://www.docjar.com/html/api/java/util/ArrayList.java.html – Tudor

+1

@ कॉर्नफ्लेक्स डीके: आप संतरे के साथ सेब की तुलना नहीं कर सकते हैं। 'ईवेंट' के लिए सूची खोजें क्योंकि इसमें 'ईवेंट' है। – Tudor

0

आपको public int hashCode() ओवरराइड करना चाहिए। दो विधियां बारीकी से संबंधित हैं।

इस बारे में और अधिक पढ़ें: http://www.javapractices.com/topic/TopicAction.do?Id=17

+1

ओपी सिर्फ 'ऐरेलिस्ट' का उपयोग कर रहा है। हालांकि यह उत्तर सच है, यह सहायक नहीं है। –

+1

नहीं, हैशकोड() के पास इसका समाधान करने के लिए कुछ भी नहीं है। ऐसा इसलिए है क्योंकि समरूपता टूट जाती है। – rlegendi

0

जब आप equals() विधि ओवरराइड, आप भी hashcode() विधि ओवरराइड करने के लिए, क्योंकि वे हाथ में हाथ जाना है। यदि दो वस्तु बराबर हैं, तो उनके पास एक ही हैशकोड होना चाहिए। हैशमैप्स इसे सहेजने वाले स्थानों का मूल्यांकन करने के लिए उपयोग करते हैं। यदि दो ऑब्जेक्ट्स बराबर नहीं हैं, तो वे एक ही हैशकोड हो सकते हैं या नहीं भी हो सकते हैं।

0

इस मामले में, आपको केवल हैशकोड विधि नहीं, समान विधि को ओवरराइड करने की आवश्यकता है।

हैशकोड और बराबर विधि दोनों को ओवरराइड किया जाना चाहिए जब आप अपनी कक्षा के ऑब्जेक्ट को हैश मैप में कुंजी के रूप में उपयोग करना चाहते हैं। हैश मैप सरणी + लिंक्डलिस्ट की संरचना का उपयोग करता है। एक कुंजी-मूल्य जोड़ी जोड़ते समय, यह पहले सरणी में इंडेक्स प्राप्त करने के लिए कुंजी के हैशकोड के आधार पर कुछ गणना करता है; फिर उस इंडेक्स स्थिति पर लिंक्डलिस्ट पर जाएं ताकि यह पता चल सके कि कुंजी-मूल्य जोड़ी पहले से मौजूद है या नहीं। यदि हां, तो यह नए मान के साथ रिकॉर्ड ओवरराइट करेगा; अन्यथा उस लिंक्डलिस्ट के अंत में कुंजी-मूल्य जोड़ी जोड़ें। एक कुंजी का पता लगाने पर, प्रक्रिया गड़बड़ है। इसलिए यदि हैशकोड विधि ओवरराइड नहीं है, तो आप सरणी में पहली राउंड खोज विफल कर देंगे। यही कारण है कि आपको दोनों विधियों को ओवरराइड करने की आवश्यकता है। ऐसा कहीं नहीं लगता है कि इन दो तरीकों के बीच अनुबंध है या उनके पास घनिष्ठ संबंध है।

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