2010-07-22 23 views
7

मेरे पास एक ऐसा फ़ंक्शन है जो किसी दिए गए कुंजी के लिए int मान देता है (HashMap<String, Integer> से)। यदि कुंजी मौजूद नहीं है, तो मैं कॉलर की जांच कर सकता हूं कुछ वापस करना चाहता हूं। ऐसा लगता है कि, आमतौर पर, यह "रिटर्न -1 होगा यदि कुंजी मौजूद नहीं है" चीज़ की तरह। हालांकि, मैं अपने मामले में उस उद्देश्य के लिए -1 आरक्षित नहीं कर सकता, क्योंकि ऋणात्मक संख्या कुंजी के लिए व्यवहार्य मान हैं जो मौजूद हैं।आदिम रिटर्न प्रकार समारोह पर "शून्य" वापसी?

केवल अन्य विकल्प मैं साथ आने के लिए अनुसरण कर रहे हैं सक्षम किया गया है:

  1. बदलें वापसी प्रकार Integer आवरण वर्ग के लिए और जांच के लिए null
  2. वापसी कुछ बहुत संभावना नहीं, Integer.MIN_VALUE
  3. रूप में इस तरह
  4. एक अतिरिक्त boolean keyExists(String key) फ़ंक्शन बनाएं जिसे हमेशा पहले
  5. float पर स्विच करें और का उपयोग

मैं इसे जावा में लिख रहा हूं, लेकिन इसी तरह की भाषा पृष्ठभूमि के लोगों को पोस्ट करने के लिए आपका स्वागत है। धन्यवाद!

+1

# 4 दिलचस्प है । आप NaN के लिए कैसे जांचते हैं? NaN! = NaN सच है। –

+1

Float.isNaN (फ्लोट);) आईएमएचओ फ्लोट लगभग कभी भी एक अच्छा विचार नहीं है। इसके बजाए लंबे या दो बार कोशिश करें। –

उत्तर

14

पहला विकल्प मेरी राय में सबसे साफ है। -1 और Integer.MIN_VALUE जैसे मैजिक नंबर गन्दा हैं, खासकर जब मान अंतर्ज्ञानी नहीं होते हैं। यह एक मूर्खतापूर्ण सी समाधान है, जो जावा डेवलपर्स आपको नफरत करेगा। जो वास्तव में आप इसका उपयोग कर रहे हैं उसके आधार पर "KeyNotFoundException" भी फेंक सकता है यदि यह केवल "असाधारण" परिस्थितियों में होता है।

+2

+1 मैं एक int वापस लौटने के साथ चला गया, लेकिन अगर कोई कुंजी नहीं मिला (तो एक keyExists (कुंजी) फ़ंक्शन) रनटाइम अपवाद फेंक रहा है। क्या आपको लगता है कि इंटीजर का उपयोग करना बेहतर समाधान होगा? यह शायद अधिक कुशल होगा, क्योंकि मेरा हैश मैप पहले से ही इंटीग्रर्स के रूप में मूल्य संग्रहीत कर रहा है ... –

+0

के लिए – idolize

+1

रनटाइम अपवाद फेंक न दें (रनटाइम अपवाद से प्राप्त कुछ)। एक नियमित, चेक अपवाद का प्रयोग करें। यदि आप कभी भी अपने प्रोग्राम को बहु-थ्रेडेड बनाना चाहते हैं, तो ध्यान रखें कि दो अलग-अलग फ़ंक्शन कॉल के साथ मान को देखने से पहले एक keyExists फ़ंक्शन को कॉल करना एक रेस स्थिति बनाता है जब तक कि आप इसे किसी ऑब्जेक्ट पर लॉक न करें, keyExists भाग को छोड़ दें और KeyNotFoundException के लिए कॉल/कैच ब्लॉक में कॉल को लपेटें। – Hut8

1

हालांकि यह एप्लिकेशन पर भारी निर्भर करता है और बाधाओं को जानता है, मैं ऊपर # 1 पसंद करूंगा। इसका कारण यह है कि यह स्पष्ट है - मेरे अनुभव में - MIN_VALUE - एक अंतर्निहित की तुलना में स्पष्ट स्थिति रखना हमेशा बेहतर होता है।

एक और विकल्प एक रैपर ऑब्जेक्ट होना है जिसमें परिणाम मूल्य को आदिम int के रूप में शामिल किया गया हो, लेकिन इसमें स्थिति मूल्य या कुछ समान है। तो यह हो सकता है कुछ की तरह: समस्या की जटिलता के आधार के बजाय एक राज्य के लिए

public class Wrapper { 
    private int value = Integer.MIN_VALUE; 
    private boolean isValid; 
    // appropriate getters and setters etc. 
} 

तुम भी बजाय एक enum एक बूलियन शामिल हो सकते हैं,। यदि आप इस तत्व को समग्र जानकारी रखते हैं - एकल कुंजी की कुंजी की जानकारी के सेट, या कुछ समान - एक कंटेनर ऑब्जेक्ट या स्टेटस ऑब्जेक्ट उन मामलों में बहुत मूल्यवान हो सकता है।

3

मैं यहां एक चेक अपवाद फेंकने के लिए वोट देता हूं। आम तौर पर मैं अपवादों को अपमानित करता हूं लेकिन ऐसा लगता है कि इस मामले में ऐसा करना उचित है। जिस मामले में मूल्य मौजूद नहीं है, उसे उस मामले से अलग से संभाला जाना चाहिए जहां मूल्य मौजूद है, अपवाद का उपयोग करके यह स्पष्ट हो जाएगा।

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

+1

मुझे लगता है कि यह वास्तव में एक अच्छा समाधान होगा कि, किसी भी तरह, कभी मेरे दिमाग को पार नहीं किया। लेकिन, मेरे विशेष मामले में, प्रदर्शन एक मुद्दा होगा, इसलिए मुझे लगता है कि मैं अपवादों से बचने जा रहा हूं। – idolize

+0

@mxrider: प्रदर्शन एक मुद्दा है ताकि आप अपवादों से बचना चाहते हैं? क्या? यह मेरे लिए समयपूर्व/गुमराह "अनुकूलन" की तरह लगता है। मैं कहूंगा कि सबसे स्वच्छ कोड संभव है, तो इसके साथ वास्तविक प्रदर्शन समस्याएं होने पर प्रोफाइलर से जांचें। – Jonik

+0

मुझे लगता है मुझे फिर से लेना चाहिए। परिस्थितियों में प्रयास/पकड़ने पर निर्भर जहां प्रदर्शन महत्वपूर्ण है (जैसे लूप या टाइमर में) एक बाधा उत्पन्न कर सकता है। मैं वास्तव में एक keyExists() फ़ंक्शन का उपयोग करने के लिए समाप्त हो गया था, और मेरा getValue() फ़ंक्शन होने पर एक विशेष रनटाइम अपवाद फेंक दिया गया है यदि कुंजी नहीं मिली है - इस तरह मुझे कोशिश/पकड़ने की आवश्यकता नहीं है, लेकिन मैं अभी भी सर्वोत्तम का पालन कर रहा हूं कार्य करती है। – idolize

0

विकल्प 5: एक अपवाद

फेंक हालांकि, इस मामले में, मैं पूर्णांक वर्ग का उपयोग कर के लिए मतदान होगा।

0

मुझे लगता है कि आपको विकल्पों # 1 और # 3 को जोड़ना चाहिए, क्योंकि यह अंतर्निहित हैश मैप के व्यवहार के अनुरूप है। HashMap के get method documentation से:

निर्दिष्ट कुंजी इस पहचान हैश नक्शे में मैप किया गया है, या अशक्त जो करने के लिए करता है, तो नक्शा इस कुंजी के लिए कोई मैपिंग शामिल मान देता है। शून्य के वापसी मूल्य से यह संकेत नहीं मिलता है कि मानचित्र में कुंजी के लिए कोई मैपिंग नहीं है; यह भी संभव है कि नक्शा स्पष्ट रूप से कुंजी को शून्य पर चिह्नित करता है। इन दो मामलों को अलग करने के लिए शामिल हैकी विधि का उपयोग किया जा सकता है। पूर्णांक आवरण वर्ग के लिए

0
  1. बदलें वापसी प्रकार और अशक्त लिए जाँच करें।

यह अधिक आम विकल्प है।

1

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

आप एक मानचित्र का उपयोग कर रहे हैं, तो आप एक पूर्णांक वैसे भी आपत्ति तो क्यों कि (या नल) वापस नहीं

तुम सच में पुरातन उपयोग करना चाहते हैं (कार्यकुशलता के लिए ??) मैं सुझाव है कि आप TObjectIntHashMap बजाय पर देखने की है। यह आदिम int मानों का उपयोग करता है। अनुपस्थिति की जांच करने के लिए, आपको अलग-अलग शामिल हैं() अलग-अलग।

1

दो स्थितियों विशिष्ट हैं:

  1. आप एक विशेष कुंजी के लिए एक मूल्य की खोज के एक उच्च अपेक्षा करते हैं।
  2. आप सुनिश्चित नहीं हैं कि कोई विशेष कुंजी एक मान संग्रहीत है।

यदि धारणा 1 गलत है, तो यह एक बग इंगित करने की संभावना है, इसलिए एक दावा के साथ पहुंच विधि में अपनी धारणा की रक्षा करें।

यदि 2 लागू होता है, तो आप किस चीज के बारे में सुनिश्चित होंगे? तो "keyExists" जैसे परीक्षण विधि प्रदान करें और मानचित्र तक पहुंचने से पहले बिल्कुल जानें।

मामले में 1, कोई जांच की आवश्यकता नहीं है, जो बहुत साफ है, लेकिन यदि आप गलत हैं तो पहुंच विफल हो जाएगी। विशेष मामलों जैसे -1 या Integer.MIN_VALUE के साथ यह सुनिश्चित करना बहुत मुश्किल है कि उनका उपयोग नहीं किया जाएगा।

बोली की तरह हास्केल, स्काला और सी # एक मूल्य के जो दूर अशक्त के उपयोग से बेहतर है की उपस्थिति/अनुपस्थिति संप्रेषित करने के लिए विशेष प्रकार है (यदि आप आप की संभावना एक NullPointerException मिल जाएगा परीक्षण करने के लिए भूल जाते हैं)

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