2012-03-06 22 views
9

मेरे पास ISO8601 प्रारूप में तिथियों की एक सरणी है और उन्हें सॉर्ट करने की आवश्यकता है। क्या किसी के पास एल्गोरिदम के लिए कोई सुझाव है जो काम करेगा? मुझे नहीं लगता कि वे तारों के रूप में सॉर्ट करेंगे जब तक कि मैं बहुत गलत नहीं हूं, इसलिए मुझे लगता है कि उन्हें अपने घटक भागों में तोड़ना होगा?सॉर्ट करें आईएसओ 8601 दिनांक आगे या पीछे

क्या कोई एल्गोरिदम पोस्ट कर सकता है, अधिमानतः भाषा अज्ञेयवादी, लेकिन वीबी या सी # उदाहरण तब तक काम करेगा जब तक यह केवल तारों और पूर्णांक का उपयोग नहीं करता है और भाषा में अंतर्निहित कोई भी कार्य नहीं करता है।

धन्यवाद!

उत्तर

20

यह इस बात पर निर्भर करता है कि आप प्रारूपों को मिश्रित कर रहे हैं या नहीं।

किसी भी विशिष्ट प्रारूप के भीतर, yyyy-mm-dd या yyyy-Www-d, आईएसओ 8601 को लेक्सिकोग्राफिक (नकारात्मक वर्षों के अलावा) को क्रमबद्ध करने के लिए बनाया गया है।

ISO 8601 wikipedia page से

: वर्ष, माह (या सप्ताह), दिन, घंटा, मिनट, सेकंड, और दूसरा के अंश:

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

इसका मतलब है कि स्ट्रिंग सॉर्टिंग ठीक काम करना चाहिए।

यह केवल तभी होता है जब आप मिश्रण प्रारूप काम नहीं करेंगे। यदि ऐसा है, तो आपको तुलना करने से पहले एक विशिष्ट प्रारूप में कनवर्ट करना होगा। इसके द्वारा, मेरा मतलब है कि सभी स्वरूपों को तुलना से पहले yyyy-mm-dd में परिवर्तित करना और फिर वांछित होने पर बाद में वापस करना।

उदाहरण के लिए, यदि आप इनपुट डेटा है:

2010-03-01:2010-03-01 
2010-01-04:2010-W01-1 

(एक विशिष्ट रूप से वास्तविक डेटा लगाकर) तो उस क्रमबद्ध करें:

2010-03-01 
2010-W01-1 

आप पहली बार उन सब को बदल सकता है। एक बार सॉर्ट हो जाने पर, आप वापस जाएं और प्रत्येक तत्व में पहले : वर्ण तक सबकुछ बंद कर दें, जो मूल रूप को पुनर्प्राप्त करेगा।

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

+0

इस दिनांक स्वरूप है: 2012-03-05 00: 30: 00.000 – alphablender

+0

@alphablender, कि एक तारीख नहीं है, यह एक है तिथि/समय :-) लेकिन सिद्धांत अभी भी है: इसे एक सामान्य रूप में परिवर्तित करें ताकि लेक्सिकोोग्राफ़िकल सॉर्टिंग काम करे, इसे क्रमबद्ध करें, फिर इसे वापस परिवर्तित करें (यदि आवश्यक हो)। यदि आपकी तिथियों में से _all_ पहले से ही उस फ़ॉर्म के हैं, तो आपको सभी को बदलने की आवश्यकता नहीं है - सामान्य स्ट्रिंग सॉर्टिंग ठीक काम करेगी। – paxdiablo

8

मुझे नहीं लगता कि वे तारों के रूप में सॉर्ट जाएगा जब तक कि मैं बहुत गलत कर रहा हूँ है,

आप बहुत गलत :-) हैं। वे स्ट्रिंग्स के रूप में सॉर्ट करेंगे। यह अन्य दिनांक प्रारूपों पर आईएसओ 8601 के प्रमुख प्लस पॉइंट्स में से एक है।

बिंदु देखें 1: http://en.wikipedia.org/wiki/ISO_8601#General_principles

...प्रतिनिधित्व की lexicographical क्रम इस प्रकार क्रम कालानुक्रमिक ...

जब तक आप नकारात्मक वर्ष के साथ काम नहीं कर रहे हैं के रूप में, एक आप एक ही समय क्षेत्र और उपफ़ॉर्मेट उपयोग कर रहे हैं यानी तुम नहीं मेल खाती है मिश्रण महीने आधारित है और सप्ताह आधारित (इन उनका कहना है के लिए धन्यवाद @paxdiablo करने और @whiskeysierra)

+2

डिज़ाइन द्वारा अच्छा लेकिन यूनिक्स एपोक मिलिस या सेक पर सॉर्ट करने से अभी भी बहुत धीमी है यदि आपके पास कई तिथियां हैं –

+0

टाइमज़ोन भी ऑर्डर पेंच करेंगे, है ना? – whiskeysierra

+0

@wiskeysierra अच्छा बिंदु। – rjmunro