2008-10-06 11 views
10

मुझे संभावित संयुक्त राज्य डाक सेवा राज्य संक्षेपों की सूची के विरुद्ध एक स्ट्रिंग को सत्यापित करने में सक्षम होना चाहिए, और Google मुझे कोई दिशा नहीं दे रहा है।यूएसपीएस राज्य संक्षेप के खिलाफ स्ट्रिंग मान्य करें

मुझे स्पष्ट समाधान पता है: और यदि सभी 50 राज्यों के खिलाफ जांच और तुलना करने के लिए (या स्विच) कथन का एक भयंकर रूप से कोड करना है, लेकिन मैं स्टैक ओवरफ्लो से पूछ रहा हूं, क्योंकि वहां करने का एक आसान तरीका होना चाहिए इस। क्या वहां कोई रेगेक्स या एन्यूमेरेटर ऑब्जेक्ट है जो मैं इसे सबसे प्रभावी तरीके से जल्दी से करने के लिए उपयोग कर सकता हूं?

[C# और .net 3.5 वैसे]

List of USPS State Abbreviations

+1

वैसे, उनमें से कई "राज्य" अब स्वतंत्र देश हैं। संघीय राज्यों माइक्रोनेशिया, मार्शल द्वीप समूह, और उन प्रशांत द्वीप समूहों में से एक या दो .. – Craig

उत्तर

18

मैं कुछ इस तरह की तरह है:

private static String states = "|AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|"; 

public static bool isStateAbbreviation (String state) 
{ 
    return state.Length == 2 && states.IndexOf(state) > 0; 
} 

इस विधि एक अनुकूलित प्रणाली दिनचर्या है कि शायद एक भी मशीन का उपयोग कर रहा है का उपयोग करने का लाभ दिया है खोज करने के लिए निर्देश। अगर मैं गैर-निश्चित लंबाई वाले शब्दों से निपट रहा था, तो मैं "|" की जांच करूंगा + राज्य + "|" यह सुनिश्चित करने के लिए कि मैंने पूर्ण मिलान के बजाय एक सबस्ट्रिंग नहीं मारा था। स्ट्रिंग कॉन्सटेनेशन के कारण, यह थोड़ी देर तक ले जाएगा, लेकिन यह अभी भी एक निश्चित समय में मेल खाता है। यदि आप लोअरकेस संक्षेपों के साथ-साथ अपरकेस को मान्य करना चाहते हैं, तो या तो राज्य के लिए जांचें। अपरकेस(), या लोअरकेस वेरिएंट को शामिल करने के लिए 'राज्य' स्ट्रिंग को दोगुना करें।

मैं गारंटी दूंगा कि यह हर बार रेगेक्स या हैशटेबल लुकअप को हरा देगा, इससे कोई फर्क नहीं पड़ता कि आप कितने रन बनाते हैं, और इसमें कम से कम स्मृति उपयोग होगा।

+0

यदि उपयोगकर्ता "एल |" दर्ज करने का प्रबंधन करता है तो क्या होता है उनके इनपुट के रूप में? मुझे लगता है कि यह इस कोड के तहत मान्य होगा। इसे आसानी से इंडेक्सऑफ ("|") लाइन के साथ तय किया जा सकता है। –

+1

फिर, यदि आप इसके बारे में चिंतित हैं, तो जब आप खोज स्ट्रिंग के चारों ओर delimiters को जोड़ते हैं। इस प्रकार आप "| एल ||" की जांच करेंगे, जो असफल हो जाएगा। –

3

यहाँ एक regex है। का आनंद लें!

^(?-i:A[LKSZRAEP]|C[AOT]|D[EC]|F[LM]|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEHINOPST]|N[CDEHJMVY]|O[HKR]|P[ARW]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$ 
+2

एक शांत रेगेक्स पर प्रॉप्स लेकिन यह सिर्फ सादा हास्यास्पद है। मुझे नहीं लगता कि रेगेक्स जाने का रास्ता है - आंखों के साथ सत्यापित करना बेहद मुश्किल है और इसे सत्यापित करने के लिए आपके द्वारा लिखे गए किसी भी परीक्षण को पहले स्थान पर इसे एक स्पष्ट तरीके से लागू करने से भी बदतर होने की संभावना है। –

+1

कुछ लोग, जब किसी समस्या का सामना करते हैं, तो सोचें "मुझे पता है, मैं नियमित अभिव्यक्तियों का उपयोग करूंगा।" अब उन्हें दो समस्याएं हैं। - जेमी ज़विंस्की। –

+0

बस एक हेड-अप: इस रेगेक्स में कई संक्षिप्त शब्द शामिल नहीं हैं, जिन्हें आमतौर पर प्यूर्तो रिको, उत्तरी मारियाना आइलैंड्स, पलाऊ और मार्शल द्वीप समूह जैसे नहीं माना जाता है। – hughdbrown

15

मैं वैध संक्षेप के साथ एक हैशटेबल पॉप्युलेट करता हूं और फिर इसे सत्यापन के लिए इनपुट के साथ जांचता हूं। यदि आपके पास प्रति शब्दकोश निर्माण में एक से अधिक चेक हैं तो यह बहुत साफ और संभवतः तेज़ है।

+0

स्वच्छ और त्वरित समाधान के लिए वोट दिया गया। कुछ डिजाइन समय लें और रनटाइम पर इसके लिए तैयार करें! – Craig

+0

विशिष्ट जेनरिक, जॉन को स्पष्ट करने के लिए धन्यवाद। –

8

ए हैशसेट < स्ट्रिंग> .NET 3.5 में अंतर्निहित प्रकारों का उपयोग करने के बारे में सोचने का सबसे साफ तरीका है। (आप इसे आसानी से केस-असंवेदनशील बना सकते हैं, या इसे < स्ट्रिंग में बदल सकते हैं, स्ट्रिंग > जहां मान पूर्ण नाम है। यह .NET 2.0/3.0 के लिए सबसे उपयुक्त समाधान भी होगा।)

गति के लिए - क्या आपको सच में विश्वास है कि यह आपके कोड में एक बाधा होगी? एक हैशसेट "बहुत अच्छी तरह से प्रदर्शन करने की संभावना है (कई लाख लुकअप एक सेकंड)। मुझे यकीन है कि विकल्प भी तेज होंगे - लेकिन गंदे। मैं सबसे सरल चीज से चिपक जाता हूं जो तब तक काम करता है जब तक आपके पास विश्वास करने का कारण न हो कि यह एक बाधा होगी।

(स्पष्ट शब्दकोश <, का उल्लेख संपादित>।)

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