2012-06-06 13 views
8

HashSet<T> में HashSet से बराबर ऑब्जेक्ट प्राप्त करें O (1) में निर्धारित किया जा सकता है कि इसमें एक निश्चित आइटम है या नहीं। अगर मैं अपने कस्टम वर्ग पर Equals() और GetHashCode() ओवरराइड, मैं एक वस्तु एक और एक अन्य वस्तु ए 'कि नहीं बराबर पहचान द्वारा रहे हैं, लेकिन हो सकता है Equals() रिटर्न true और GetHashCode() रिटर्न ही हैश कोड, जिसके लिए। ओ (1)

अब, ए हैश सेट में है, मैं ए में ओ (1) दिया ए '(जो हैश सेट के परिप्रेक्ष्य से ए के बराबर है) को पुनः प्राप्त करना चाहता हूं।

var a = new MyClass("A"); 
var a_prime = new MyClass("A"); 
Debug.Assert(a.Equals(a_prime)); 
Debug.Assert(a.GetHashCode() == a_prime.GetHashCode()); 

var set = new HashSet<MyClass>(); 
set.Add(a); 
Debug.Assert(set.Contains(a_prime)); 

// This:  
var retrieved_a = set.Get(a_prime); 

यह कैसे करें?

(ध्यान दें कि this जवाब मैं तलाश कर रहा हूँ नहीं है, और this सभी में कोई जवाब नहीं है।)


कुछ पृष्ठभूमि जानकारी: मैं प्रशिक्षु अपने ही करने के लिए सेट का उपयोग करना चाहते वही तरीके से सी # इंटर्न स्ट्रिंग्स: समान वस्तुओं को केवल एक उदाहरण की आवश्यकता होती है। इस तरह से मैं इस तरह के ऑब्जेक्ट में मेटाडेटा जोड़ सकता हूं और सुनिश्चित कर सकता हूं कि मेटाडेटा के बिना कहीं भी कोई अन्य समान उदाहरण नहीं है।

+6

क्यों नहीं 'ए' से' ए' में एक शब्दकोश मैपिंग का उपयोग न करें? –

+0

संभावित डुप्लिकेट [हैशसेट से वास्तविक आइटम कैसे प्राप्त करें?] (Http://stackoverflow.com/questions/7760364/how-to-retrieve-actual-item-from-hashsett) – nawfal

+0

एक और [कैसे उपयोग करें -इस संदर्भ-मूल्यों की एक HashSet-बिना-गणन?] (http://stackoverflow.com/questions/7290443/how-to-access-the-reference-values-of-a-hashsettvalue-without - गणना?) – nawfal

उत्तर

7

HashSet पर कोई विधि नहीं है जो आप चाहते हैं।

आप एक Dictionary बजाय का उपयोग कर सकते हैं:

var dict = new Dictionary<MyClass, MyClass>(); 
dict[a] = a; 
Debug.Assert(dict.ContainsKey(a_prime)); 
var retrieved_a = dict[a_prime]; 
+0

मैंने हमेशा उन डिक्ट्स बनाने से परहेज किया है जो खुद को मानचित्र बनाते हैं। क्या यह बुरा अभ्यास है? या मैं बस कुछ भी नहीं के बारे में चिंता कर रहा हूँ? –

+0

@ हंस हमेशा के रूप में, यह निर्भर करता है। आपको क्यों लगता है कि यह एक बुरा अभ्यास है? आप उनसे क्यों बचते हैं? – svick

+3

@svick मुझे नहीं पता, यह सिर्फ मेरे लिए अजीब लगता है। मुझे लगता है कि मेरे पास इससे बचने के लिए कोई ठोस कारण नहीं है, लेकिन मुझे कभी भी इस तरह के निर्माण का उपयोग नहीं करना पड़ा, लेकिन किसी कारण से 'dict [a] = a;' मुझे क्रिंग करता है। –

1

अगर मैं सही ढंग से याद है, Dictionary, बुनियादी सेट के संचालन के लगातार समय कार्यान्वयन नहीं है, जबकि HashSet है। हैशसेट से अन्य जटिलताओं को बढ़ाए बिना निरंतर समय के बराबर लुकअप के साथ इसे लागू करने का एक तरीका यहां दिया गया है। यदि आपको कई यादृच्छिक तत्वों को पकड़ने की आवश्यकता है तो इस दृष्टिकोण का उपयोग करना महत्वपूर्ण है। मैं नीचे जो लिखता हूं वह जावा सिंटैक्स है, क्योंकि मुझे सी # नहीं पता है, लेकिन विचार भाषा-स्वतंत्र है।

class MySet<A> { 
    ArrayList<A> contents = new ArrayList(); 
    HashMap<A,Integer> indices = new HashMap<A,Integer>(); 

    //selects equal element in constant time 
    A equalElement(A input) { 
     return contents.get(indices.get(input)); 
    } 

    //adds new element in constant time 
    void add(A a) { 
     indices.put(a,contents.size()); 
     contents.add(a); 
    } 

    //removes element in constant time 
    void remove(A a) { 
     int index = indices.get(a); 
     contents.set(index,contents.get(contents.size()-1)); 
     contents.remove(contents.size()-1); 
     indices.set(contents.get(contents.size()-1),index); 
     indices.remove(a); 
    } 

    //all other operations (contains(), ...) are those from indices.keySet() 
} 
+0

क्षमा करें, यादृच्छिक एक टाइपो था, मेरा मतलब यादृच्छिक के बजाय बराबर था। मैंने अभी विधि को सही किया है। असल में, हैशसेट का उपयोग करने के बजाय, मैं एक हैश मैप * और * एक ऐरेलिस्ट का उपयोग करता हूं, जिसमें एक ही तत्व होते हैं और हैश मैप के साथ उस तत्व के सूचकांक को इंगित करता है। हैशसेट से सरल "हां मेरे पास पहले से ही यह कुंजी है" के बजाय, हैश मैप कहता है "हां मेरे पास पहले से ही यह कुंजी है और यह पूर्णांक 'i' को इंगित करती है। फिर ArrayList में आप ऑब्जेक्ट को स्थिति 'i' पर ले कर अपना ऑब्जेक्ट ला सकते हैं। – user1111929

+0

सुधार के लिए धन्यवाद!अब यह बहुत अधिक प्रासंगिक है! एक साइड नोट के रूप में, फिर भी मैं उस "निरंतर समय" दावे के बारे में बहुत सावधान रहूंगा। मुझे नहीं लगता कि हैश मैप्स ने सबसे बुरी स्थिति-ओ (1) लाने का समय दिया है, मुझे लगता है कि यह औसत-ओ (1) है, और यदि आप, उदाहरण के लिए, चाबियाँ के GetHashCode के साथ बुराई से टिंकर हो मानचित्र का वैसे भी, हटाए गए -1 और पिछली टिप्पणी, क्योंकि यह अब पोस्ट के साथ मेल नहीं खाती है। – quetzalcoatl

+0

आप सही हैं, "निरंतर समय" के साथ मेरा मतलब है "औसत समय: निरंतर"। – user1111929

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