चलो यह C # वर्ग है (यह जावा में लगभग समान होगा)
public class MyClass {
public string A {get; set;}
public string B {get; set;}
public override bool Equals(object obj) {
var item = obj as MyClass;
if (item == null || this.A == null || item.A == null)
{
return false;
}
return this.A.equals(item.A);
}
public override int GetHashCode() {
return A != null ? A.GetHashCode() : 0;
}
}
जैसा कि आप देख सकते हैं, केवल MyClass
पर निर्भर करता है के दो उदाहरणों की समानता A
। तो दो उदाहरण हो सकते हैं जो समान हैं, लेकिन उनकी B
संपत्ति में जानकारी के विभिन्न टुकड़े पकड़े हुए हैं।
कई भाषाओं के एक मानक संग्रह पुस्तकालय में (सी # और जावा सहित), निश्चित रूप से एक Set
( HashSet
सी # में) है, जो एक संग्रह है, जो समान उदाहरणों के प्रत्येक सेट से अधिकतम एक आइटम पर पकड़ सकता है।
एक आइटम जोड़ सकते हैं, आइटम निकाल सकते हैं और जांच सकते हैं कि सेट में कोई आइटम है या नहीं। लेकिन सेट से एक विशेष आइटम प्राप्त करना असंभव क्यों है?
HashSet<MyClass> mset = new HashSet<MyClass>();
mset.Add(new MyClass {A = "Hello", B = "Bye"});
//I can do this
if (mset.Contains(new MyClass {A = "Hello", B = "See you"})) {
//something
}
//But I cannot do this, because Get does not exist!!!
MyClass item = mset.Get(new MyClass {A = "Hello", B = "See you"});
Console.WriteLine(item.B); //should print Bye
मेरे आइटम को पुनर्प्राप्त करने का एकमात्र तरीका पूरे संग्रह पर पुनरावृति करना और समानता के लिए सभी आइटम की जांच करना है। हालाँकि, O(n)
इसके बजाय समय लगता है O(1)
!
मुझे अब तक किसी सेट से मिलने वाली कोई भी भाषा नहीं मिली है। सभी "आम" भाषाएं जिन्हें मैं जानता हूं (जावा, सी #, पायथन, स्काला, हास्केल ...) उसी तरह से डिज़ाइन किए गए लगते हैं: आप आइटम जोड़ सकते हैं, लेकिन आप उन्हें पुनर्प्राप्त नहीं कर सकते। क्या कोई अच्छा कारण है कि ये सभी भाषाएं कुछ आसान और स्पष्ट रूप से उपयोगी का समर्थन नहीं करती हैं? वे सभी गलत नहीं हो सकते हैं, है ना? क्या कोई भाषाएँ हैं जो इसका समर्थन करती हैं? हो सकता है कि सेट से किसी खास चीज को दोबारा लेना गलत हो, लेकिन ऐसा क्यों?
कुछ संबंधित SO प्रश्न हैं:
/programming/7283338/getting-an-element-from-a-set
/programming/7760364/how-to-retrieve-actual-item-from-hashsett
Set<E>
कार्यान्वयन सिर्फ Map<E,Boolean>
अंदर पर हैं।
a == b
मामले में संवेदनशीलता ( हमेशा सच) को तोड़ता है this.A == null
। if (item == null || this.A == null || item.A == null)
परीक्षण संभवतः क्रम कृत्रिम रूप से "उच्च गुणवत्ता" कोड बनाने के लिए, बहुत करने के लिए "overdone" और चेक है। मैं इस तरह के "ओवरचेकिंग" देखता हूं और कोड रिव्यू पर हर समय अत्यधिक सही रहता हूं।
std::set
ऑब्जेक्ट रिट्रीवल का समर्थन करता है, इसलिए सभी "आम" भाषाएं नहीं हैं जैसे आप वर्णन करते हैं।