2012-10-16 19 views
6

मेरे पास मेरे जावा क्लास के लिए एक प्रोग्राम है जहां मैं टेक्स्ट दस्तावेज़ों की निर्देशिका की तुलना करने के लिए हैशसेट का उपयोग करना चाहता हूं। अनिवार्य रूप से, मेरी योजना प्रत्येक पेपर के लिए तारों का हैशसेट बनाना है, और उसके बाद दो पेपर हैशसेट्स को एक हैशसेट में जोड़ना और समान 6-शब्द अनुक्रमों की संख्या पाएं।जावा में हैशसेट टकराव

मेरा सवाल है, क्या मुझे मैन्युअल रूप से जांचना है, और हैंडल, टकराव करना है, या जावा मेरे लिए ऐसा करता है?

+1

आप यहां जवाब दे सकते हैं [http://stackoverflow.com/questions/4980757/how-do-hashtables-deal-with-collisions) –

उत्तर

3

जावा हैश मैप्स/सेट स्वचालित रूप से हैश टकराव को संभालने के लिए सेट करता है, यही कारण है कि equals और hashCode विधियों दोनों को ओवरराइड करना महत्वपूर्ण है। चूंकि दोनों को डुप्लिकेट या अद्वितीय प्रविष्टियों को अलग करने के लिए सेट्स द्वारा उपयोग किया जाता है।

यह भी ध्यान रखना महत्वपूर्ण है कि इन हैश टकराव एक प्रदर्शन को प्रभावित करते हैं क्योंकि एकाधिक ऑब्जेक्ट्स को उसी हैश द्वारा संदर्भित किया जाता है।

public class MyObject { 
private String name; 

//getter and setters 


public int hashCode() { 
    int hashCode = //Do some object specifc stuff to gen hashCode 
    return int; 
} 

public boolean equals(Object obj) { 
    if(this==obj) return true; 
    if(obj instanceOf MyObject) { 
     if(this.name.equals((MyObject)obj.getName())) { 
      return true; 
     } 
    return false; 
} 
} 
} 

नोट: मानक जावा ऐसे स्ट्रिंग के रूप में पहले से ही ऑब्जेक्ट्स hashCode को लागू किया है और बराबर होती है ताकि आप केवल करने के लिए कि डेटा ऑब्जेक्ट की अपनी तरह के लिए है।

+0

ठीक है, ठंडा। मैंने पदों की एक उचित मात्रा में कहा है कि हैश मैप्स ने टक्कर संभालने में अंतर्निहित किया था, लेकिन मुझे कुछ भी नहीं मिला जो विशेष रूप से कहा गया था कि हैशसेट्स ने टक्कर संभालने में अंतर्निहित किया था। – marcinx27

+0

कृपया मेरा संपादन नोट करें: हैशकोड दोनों को ओवरराइड करना और विधियों के बराबर होना महत्वपूर्ण है, क्योंकि इन दोनों का उपयोग डुप्लिकेट की पहचान करने के लिए सेट द्वारा किया जाता है। – dngfng

+0

आपका क्या मतलब है? – marcinx27

0

मुझे लगता है कि आपने हैश टकराव के लिए नहीं पूछा था, है ना? सवाल यह है कि क्या होता है जब हैशसेट ए और हैशसेट बी को एक सेट में जोड़ा जाता है उदा। a.addAll द्वारा (बी)।

उत्तर में सभी तत्व शामिल हैं और कोई डुप्लीकेट नहीं है। स्ट्रिंग्स के मामले में इसका मतलब है कि आप + b.size() जोड़ने के बाद add-a.size() से पहले a.size() के साथ सेट से बराबर स्ट्रिंग की संख्या गिन सकते हैं।

इससे कोई फर्क नहीं पड़ता कि स्ट्रिंग्स में से कुछ के पास हैश कोड है लेकिन बराबर नहीं है।

+0

यह केवल तभी सही है जब आप सेट या अन्य ऑब्जेक्ट्स में स्ट्रिंग ऑब्जेक्ट्स जोड़ते हैं जो पहले से ही हैशकोड और बराबर लागू कर चुके हैं। यदि आपके पास अपना ऑब्जेक्ट है तो आपको निश्चित रूप से दोनों को लागू करना होगा। – dngfng

+0

की तरह। मैं जो कह रहा हूं वह यह है कि यदि मैं a.addAll (बी) करता हूं, तो क्या यह निश्चित है कि मेरे पास कोई डुप्लीकेट नहीं होगा और क्या यह निश्चित है कि ए और बी से प्रत्येक अद्वितीय स्ट्रिंग वहां होगी? – marcinx27

+0

@dngfng तो अगर मैं तारों का उपयोग कर रहा हूं, तो मुझे टकराव की जांच करने की आवश्यकता नहीं है। मैं बस सभी स्ट्रिंग्स को अपने हैशसेट्स में डाल सकता हूं और यह सुनिश्चित कर सकता हूं कि अद्वितीय सब कुछ वहां है, और कोई डुप्लिकेट नहीं है? – marcinx27

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