2013-04-10 5 views
5

मान लीजिए कि दो वर्ण String हैं, जो आईएसओ 639 देश या भाषा नाम का प्रतिनिधित्व करना चाहिए।यह जांचने के लिए क्लीनर तरीका है कि कोई स्ट्रिंग जावा में आईएसओ भाषा का आईएसओ देश है

तुम्हें पता है, Locale वर्ग दो कार्य getISOLanguages और getISOCountries कि सभी आईएसओ भाषाओं और आईएसओ देशों में क्रमश: साथ String की एक सरणी वापसी है।

यह जांचने के लिए कि कोई विशिष्ट String ऑब्जेक्ट एक वैध आईएसओ भाषा या आईएसओ देश है, मुझे String मिलान के लिए उस सरणी के अंदर देखना चाहिए। ठीक है, मैं इसे बाइनरी खोज (उदा। Arrays.binarySearch या अपाचे कॉमन्स ArrayUtils.contains) का उपयोग करके कर सकता हूं।

सवाल यह है: कि एक क्लीनर तरीका प्रदान करता है, उदाहरण के लिए (अमरूद या अपाचे कॉमन्स पुस्तकालयों से उदा) किसी भी उपयोगिता मौजूद है एक ऐसा कार्य जो boolean को String मान्य आईएसओ 639 भाषा या आईएसओ 639 देश के रूप में मान्य करने के लिए देता है?

उदाहरण के लिए:

public static boolean isValidISOLanguage(String s) 
public static boolean isValidISOCountry(String s) 
+0

सरणी (यह या अन्य तरीका) – Dariusz

+0

खोज करने से पहले अपनी स्ट्रिंग की लंबाई जांचना याद रखें हां बिल्कुल ... धन्यवाद! –

+0

@Dariusz: मुझे यकीन नहीं है कि मैं परेशान होगा - कम से कम यदि हैश लुकअप कर रहा हूं। जब तक आप बड़े तारों को देने की उम्मीद नहीं करते हैं, जो हैश के लिए काफी समय लेते हैं, यह किसी भी महत्वपूर्ण लाभ के लिए जटिलता की तरह प्रतीत होता है। –

उत्तर

13

मैं या तो एक द्विआधारी खोज या किसी तीसरे पक्ष लाइब्रेरी का उपयोग कर परेशान नहीं होगा - HashSet इस के लिए ठीक है:

public final class IsoUtil { 
    private static final Set<String> ISO_LANGUAGES = new HashSet<String> 
     (Arrays.asList(Locale.getISOLanguages())); 
    private static final Set<String> ISO_COUNTRIES = new HashSet<String> 
     (Arrays.asList(Locale.getISOCountries())); 

    private IsoUtil() {} 

    public static boolean isValidISOLanguage(String s) { 
     return ISO_LANGUAGES.contains(s); 
    } 

    public static boolean isValidISOCountry(String s) { 
     return ISO_COUNTRIES.contains(s); 
    } 
} 

आप सकता है के लिए चेक स्ट्रिंग लम्बाई पहले, लेकिन मुझे यकीन नहीं है कि मैं परेशान होगा - कम से कम तब तक जब तक आप प्रदर्शन हमलों के खिलाफ खुद को सुरक्षित नहीं करना चाहते हैं, जहां आपको भारी तार दिए जाते हैं जो हैश के लिए काफी समय लेते हैं।

संपादित करें: यदि आप करते हैं एक 3 पार्टी पुस्तकालय का उपयोग करना चाहते ICU4J सबसे अधिक संभावना दावेदार है, -, लेकिन यह अच्छी तरह से Locale द्वारा समर्थित लोगों की तुलना में अधिक अप-टू-डेट सूची हो सकता है तो आप चाहते हैं संभवतः आईसीयू 4 जे का उपयोग करने के लिए।

+0

मैं आमतौर पर तृतीय पक्ष लाइब्रेरी (जैसे गुवा और अपाचे कॉमन्स) पसंद करता हूं क्योंकि उन्हें अक्सर सुधार किया जाता है, जबकि मैं लगातार अपना कोड नहीं देख सकता: हजारों कोड पढ़ने के लिए लाइब्रेरी संस्करण को बदलना बेहतर है। हालांकि, मैं वास्तव में आपके उत्तर की सराहना करता हूं। धन्यवाद! –

+0

@mat_boy: आप इस कोड को समय के साथ बदलने की उम्मीद कैसे करेंगे? यह पहले से ही देशों और भाषाओं की वास्तविक सूची खोजने के लिए जेडीके को सौंप रहा है ... –

+0

ठीक है, यह इस कोड के बारे में नहीं है, यह सिद्धांत रूप में है :) इसके अलावा, अगर मैंने पहले से ही लाइब्रेरी का आयात किया है, तो मैं आमतौर पर पसंद करता हूं कोड को और अधिक पठनीय बनाने के लिए उन पुस्तकालयों से विधियों का उपयोग करें। –

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