2012-11-23 13 views
5

मेरे पास कई कुंजी-मूल्य सूचियों वाला एक वर्ग है। प्रत्येक कुंजी (एक सूची के भीतर) अद्वितीय होना चाहिए, इसलिए मैं हैश मैप का उपयोग करता हूं। जब कोड में कहीं भी मैं एक सूची में एक नया आइटम जोड़ता हूं, तो मैं हैश मैप के put(K, V) का उपयोग कर रहा हूं। यदि मैं पहले से मौजूद कुंजी के साथ किसी आइटम को जोड़ने का प्रयास करता हूं तो मैं अपना कोड अपवाद फेंकना चाहता हूं। और, क्योंकि इस तरह के जोड़ कार्यक्रम में कई स्थानों पर किया जाता है, इसलिए मैं उनमें से प्रत्येक में जांच जोड़ने से बचना चाहता हूं। तो यह सूची वर्ग स्वयं होना चाहिए जो मौजूदा कुंजी-मूल्य जोड़ी को बदलने की अनुमति नहीं देगा।विशिष्टता के साथ हैश मैप चेक

मैंने अपने स्वयं के साथ हैश मैप क्लास को विस्तारित करने का विचार किया, जो इस तरह की जांच करेगा और अपवाद फेंक देगा। हालांकि, हैश मैप का put अपवाद नहीं फेंकता है, इसलिए मैं इसे भी नहीं कर सकता।

ऐसे व्यवहार को प्राप्त करने के लिए एक अच्छा तरीका क्या होगा? मैं हैश मैप को कुछ बेहतर तरीके से बदलने के लिए तैयार हूं, लेकिन मुझे वस्तुओं को जोड़ने और पुनर्प्राप्त करने में तेज़ होने की आवश्यकता है।

अद्यतन: सभी अच्छे सुझावों के लिए धन्यवाद। चूंकि मैं जावा में एक पूर्ण नौसिखिया हूं, अब मुझे सबसे अच्छा चुनने में सक्षम होने के लिए बहुत कुछ सीखना है :) वैसे भी, मैं लंच ब्रेक के भीतर इतने सारे विकल्प प्राप्त करने के लिए आभारी हूं!

+0

कॉमन्स संग्रह को वह एक्सपोजर नहीं मिलता है जो इसके लायक है ... – Isaac

उत्तर

0

आप एक अपवाद फेंक सकते हैं जो रनटाइम अपवाद को बढ़ाता है।

+2

अरे आप डाउनवॉटर, मेरा जवाब मान्य है। कारण बताएं कि आपने – AlexWien

+1

को डाउनवोट क्यों नहीं किया है, लेकिन मुझे लगता है कि डाउनवॉटिंग का कारण यह था कि आपने एक समाधान का प्रस्ताव दिया था जिसके लिए ओपी को डुप्लिकेट जांचने के लिए स्पष्ट रूप से कोड करने की आवश्यकता होगी, जबकि ओपी स्पष्ट रूप से बताता है कि वे देख रहे हैं एक तंत्र के लिए जो इसे स्वचालित रूप से करेगा। – Isaac

+1

@AlexWien मैंने डाउनवोट नहीं किया लेकिन आप लिस्कोव प्रतिस्थापन सिद्धांत का उल्लंघन करेंगे। – Mik378

2

कई विचार:
ए अपवाद को फेंक दें जो आपके वर्ग में रनटाइम अपवाद को बढ़ाता है जो हैश मैप को बढ़ाता है।
बी। किसी प्रकार का मैपवापर प्रदान करें जो एक मानचित्र को पैरामीटर के रूप में प्राप्त करेगा, प्राप्त होगा, रखेगा, और कुछ अन्य तरीकों, हस्ताक्षर के साथ जो आपको अधिक उपयुक्त बनाता है।

+0

'बी' पहले से मौजूद है। नीचे मेरा जवाब देखें। – Isaac

+0

@zaske Liskov उल्लंघन भी यहां। – Mik378

+0

@ मिक 378, 'ए' यहां एलएसपी का उल्लंघन करता है; 'बी' नहीं है। लेकिन 'बी' पहले से ही कॉमन्स कलेक्शन के भीतर उपलब्ध है (मेरा जवाब देखें), पहिया को फिर से शुरू करने की कोई आवश्यकता नहीं है। – Isaac

7

आप इस के लिए Commons Collections, की तरह कुछ का उपयोग कर सकते हैं:

Map map = MapUtils.predicatedMap(new HashMap(), PredicateUtils.uniquePredicate(), 
      null); 

यह एक Map उदाहरण जब भी आप एक कुंजी-मान पेयर डालने जब एक ही कुंजी पहले से मौजूद कोशिश है कि एक अपवाद फेंक जाएगा पैदा करेगा।

बेशक, आप अपना खुद का Predicate उदाहरण बनाकर और PredicateUtils.uniquePredicate() के बजाय इसका उपयोग करके इस व्यवहार को कस्टमाइज़ कर सकते हैं। आपका खुद का Predicate ऐसा करने के लिए जो भी आपको करने की ज़रूरत है, उदाहरण के लिए, यह डिफ़ॉल्ट uniquePredicate() द्वारा फेंकने वाले किसी भिन्न प्रकार के अपवाद को फेंक सकता है।

6

मैं इस मामले में के बाद से HashMap वर्ग, का विस्तार नहीं होगा, यह Liskov प्रतिस्थापन सिद्धांत के उल्लंघन करने के लिए नेतृत्व क्योंकि आप एक आधार वर्ग विधि के व्यवहार में परिवर्तन होगा।

इसके बजाय मैं रचना का प्रयोग करेंगे:

अपने CustomHashMap वर्ग Map इंटरफ़ेस को लागू करने और एक HashMap क्षेत्र होने बनाएँ। और HashMap कक्षा में मौजूद प्रत्येक विधियों को दोबारा विभाजित करें, को put() विधि => को छोड़कर प्रत्येक के लिए मूल HashMap पर एक प्रतिनिधिमंडल जोड़कर entry पहले से मौजूद है।

+0

+1 एलएसपी का उल्लेख करने के लिए, और समाधान के लिए धन्यवाद। – texnic

0

आप हैश मैप का विस्तार कर सकते हैं और एक अपवाद फेंक सकते हैं जो रनटाइम अपवाद के उप-वर्ग या पुट विधि द्वारा पहले से ही अपवाद में से एक है।

1

javadoc for Map#put states:

फेंकता IllegalArgumentException यदि निर्दिष्ट कुंजी या मूल्य के कुछ संपत्ति इस नक्शे में संग्रहीत किए जाने से रोकता है

मैं आपके उपयोग के मामले कि श्रेणी में आता है लगता है और इसलिए मैं उस संभावना का उपयोग करूंगा। चूंकि यह एक अनचेक अपवाद है, इसलिए आप रचना का उपयोग कर सकते हैं, HashMap लपेटें और put विधि में डुप्लीकेट पर IllegalArgumentException फेंक दें।

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