2016-02-01 5 views
6

कहें कि मुझे छात्र वस्तुओं का संग्रह संग्रहीत करने की आवश्यकता है और प्रत्येक छात्र के पास एक अद्वितीय आईडी है। एक विकल्प उन सभी को एक सूची में स्टोर करना है, लेकिन फिर जब छात्र की तलाश करते हैं, तो मुझे एक रैखिक खोज करना होगा और उनकी आईडी की जांच करनी होगी। दूसरा विकल्प नक्शा का उपयोग करना होगा, जैसे कुछ: मानचित्र जहां कुंजी छात्र छात्र आईडी है जो वास्तविक छात्र वस्तुओं के लिए नक्शा है।मानचित्रों में संग्रहीत वस्तुओं का सही उपयोग

क्या यह समस्या के लिए एक समझदार दृष्टिकोण है? एक तरफ यह सही लगता है क्योंकि मैं आसानी से अपने आईडी द्वारा एक छात्र को पुनः प्राप्त कर सकता हूं, हालांकि, ऐसा लगता है कि मैं आईडी को थोड़ा अनावश्यक रूप से संग्रहीत कर रहा हूं, जो पहले से ही छात्र वस्तु के भीतर मौजूद है - इसलिए मैं सॉर्ट कर रहा हूं इसे दो बार संग्रहित करने के लिए, लेकिन कुंजी लुकअप तंत्र है।

मेरे ऐड होगा कुछ की तरह:

public void add(Student s) { 
    lookup.put(s.getId(), s); 
} 
+0

मैं यही करता हूं। आप अपने छात्र ऑब्जेक्ट पर बराबर() और हैशकोड विधियों को भी लागू कर सकते हैं –

+3

डेटा संरचनाएं भावनाओं के बारे में नहीं हैं – wero

उत्तर

1

इस अतिरेक केवल एक ही आप कभी भी प्रोग्रामिंग में सामना करेंगे हो सकता है।

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

यदि आपको वास्तव में लगता है कि यह ओवरहेड बहुत अधिक है, तो आपके मैप डेटा स्ट्रक्चर के अंदर रखी गई वस्तुओं को आईडी प्रॉपर्टी से हटाया जा सकता है, और आईडी प्रॉपर्टी का उपयोग केवल पुनर्प्राप्ति के दौरान कुंजी के रूप में किया जाएगा, आप कर सकते हैं मानचित्र कुंजी से आईडी का अनुमान लगाएं।

0

इस मामले में कोई वास्तविक सही उपयोग नहीं है। एक बार जब आप इसे समाप्त कर लेंगे तो आपको इस संग्रह के साथ क्या करना है, इस पर विचार करने की आवश्यकता है। क्या आप इसके ऊपर फिर से जा रहे हैं? क्या आप इसे सॉर्ट करना चाहते हैं?

Map बनाना निश्चित रूप से संभव है जो स्वचालित रूप से मूल्य से कुंजी खींचता है लेकिन फिर, इस संरचना की उपयोगीता की सीमा है क्योंकि पुनरावृत्ति या सॉर्टिंग अधिक कठिन हो सकती है।

यहां एक CurriedHashMap है जो आप इस पर विचार कर रहे हैं। इस तथ्य को अनदेखा करें कि यह हुड के नीचे HashMap कार्यक्षमता का उपयोग कर रहा है।

class CurriedHashMap<K, V> extends HashMap<K, V> { 

    /** 
    * Function that extracts key from value. 
    */ 
    final Function<V, K> curry; 

    public CurriedHashMap(Function<V, K> curry) { 
     this.curry = curry; 
    } 

    /** 
    * One-value put - the key is intuited from the value using the `curry` function. 
    */ 
    public V put(V value) { 
     return super.put(curry.apply(value), value); 
    } 

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