मैं ऐसा आमतौर पर नहीं कोड पैदा करता है, लेकिन हाल ही में मैं एक विकल्प नहीं होने शुरू कर दिया। मुझे हैशसेट का सही तरीके से उपयोग करने के बारे में कुछ बड़ी गलतफहमी हो सकती है। तो यह संभव हो सकता है कि मैंने जो कुछ किया वह सिर्फ सादा गलत है। हालांकि मैं किसी भी मदद के लिए आभारी हूं, आप पेशकश कर सकते हैं। तो वास्तविक समस्या:जावा Hashset.contains() जावा में रहस्यमय परिणाम
एक छोटे से कार्यक्रम में मैं लिख रहा था, मैं बहुत ही समान वस्तुएं उत्पन्न कर रहा था, जो, जब बनाया गया, एक बहुत ही विशिष्ट आईडी (string
या मेरे अंतिम पुनरावृत्ति में long
) होगा। चूंकि प्रत्येक वस्तु नई वस्तुओं को जन्म देती है, इसलिए मैं उन सभी को फ़िल्टर करना चाहता हूं जिन्हें मैंने पहले ही बनाया है। इसलिए मैंने प्रत्येक नई ऑब्जेक्ट की आईडी को मेरे हैश (सेट) में फेंकना शुरू कर दिया और HashSet.contains()
के साथ परीक्षण किया, यदि कोई ऑब्जेक्ट पहले बनाया गया था। यहाँ पूरा कोड है:
// hashtest.java
import java.util.HashSet;
class L {
public long l;
public L(long l) {
this.l = l;
}
public int hashCode() {
return (int)this.l;
}
public boolean equals(L other) {
return (int)this.l == (int)other.l;
}
}
class hashtest {
public static void main(String args[]) {
HashSet<L> hash = new HashSet<L>();
L a = new L(2);
L b = new L(2);
hash.add(a);
System.out.println(hash.contains(a));
System.out.println(hash.contains(b));
System.out.println(a.equals(b));
System.out.println(a.hashCode() == b.hashCode());
}
}
उत्पादन निम्नलिखित का उत्पादन:
true
false
true
true
तो जाहिरा तौर पर, contains
L
द्वारा प्रदान की equals
समारोह का उपयोग नहीं करता, या मैं अवधारणा के कुछ प्रमुख गलतफहमी है ...
मैंने इसे ओपनजेडके (वर्तमान संस्करण उबंटू में शामिल किया गया) और ओरेकल से आधिकारिक वर्तमान जावा को Win7
पर परीक्षण कियापूर्णता आधिकारिक जावा-api प्रलेखन के लिए HashSet.contains()
के लिए:
public boolean contains(Object o)
रिटर्न
true
इस सेट निर्दिष्ट तत्व है या नहीं। अधिक औपचारिक रूप से,true
लौटाता है यदि केवल और यदि यह सेट में कोई तत्वe
है, तो(o==null ? e==null : o.equals(e))
।
http://download.oracle.com/javase/6/docs/api/java/util/HashSet.html#contains(java.lang.Object)
कोई भी विचार या सुझाव?
स्पष्टीकरण के लिए - यदि आपके पास "बराबर" के अपने संस्करण का हस्ताक्षर नहीं है, तो आप वास्तव में बराबर ओवरलोडिंग नहीं कर रहे हैं, और हैशसेट (और बाकी सब कुछ) मूल बराबर विधि का उपयोग करेगा जब तक कि यह सीधे नहीं जानता कक्षा एल के बारे में (जैसे आपका टेस्ट कोड करता है)। इसका परीक्षण करने के लिए, जोड़ें: System.out.println (a.equals ((ऑब्जेक्ट) बी)); आपके परीक्षण कार्यक्रम में - यह झूठी वापसी करनी चाहिए। –