2010-03-22 26 views
7

मैं पर्ल में तिथियों को कैसे क्रमबद्ध कर सकता हूं?मैं पर्ल में तिथियों को कैसे क्रमबद्ध कर सकता हूं?

my @dates = ("02/11/2009" , "20/12/2001" , "21/11/2010"); 

मेरे पास मेरी सरणी में तिथियां हैं। मैं उन तिथियों को कैसे क्रमबद्ध कर सकता हूं?

मेरा दिनांक प्रारूप dd/mm/YYYY है।

+11

'YYYY/MM/DD' के रूप में संग्रहीत तिथियां बहुत आसान बनाती हैं। जब भी आप उन्हें प्रदर्शित करते हैं तो आप जो भी चाहें कर सकते हैं। –

उत्तर

18
@dates = sort { join('', (split '/', $a)[2,1,0]) cmp join('', (split '/', $b)[2,1,0]) } @dates; 

या अलग छंटाई सबरूटीन का उपयोग कर:

sub mysort { 
    join('', (split '/', $a)[2,1,0]) cmp join('', (split '/', $b)[2,1,0]); 
} 
@dates = sort mysort @dates; 

अद्यतन: एक और अधिक कुशल दृष्टिकोण Schwartzian रूपांतरण है:

@dates = 
    map $_->[0], 
    sort { $a->[1] cmp $b->[1] } 
    map [ $_, join('', (split '/', $_)[2,1,0]) ], @dates; 
+4

इसे श्वार्टज़ियन ट्रांसफॉर्म या अन्य कैश किए गए कुंजी प्रकार के साथ करें ताकि आपको हर बार मूल्यों को दोबारा नहीं बदला जाए। –

+0

@brian: धन्यवाद, मैं इसके बारे में भूल गया :-) –

3

मैं YYYY/MM/DD प्रारूप बेहतर सिर्फ इस कारण के लिए, पसंद करते हैं। 1000/01/01 और 9999/12/31 के बीच, तारीखों को व्यवस्थित करने की गारंटी है।

my @sorted_alt = sort map { join '/', reverse split '/', $_ } @dates; 

तुम सच में DD/MM/YYYY प्रारूप में की जरूरत है, तो आप हमेशा एक पूरा Schwartzian transform के लिए जा सकते हैं।

my @sorted = map { 
    join '/', reverse split '/', $_ 
} 
sort 
map { 
    join '/', reverse split '/', $_ 
} @dates; 

या

my @sorted = map { 
    join '/', reverse @$_ 
} 
sort { "@$a" cmp "@$b" } 
map { 
    [ reverse split '/', $_ ] 
} @dates; 
1

या टाइमस्टैम्प में युग प्रारूप का उपयोग करें और उन्हें संख्या के रूप में सॉर्ट। फिर डेट स्ट्रिंग आउटपुट को अपनी इच्छानुसार कनवर्ट करें। फिर आप मूल तारों को स्वरूपित करने के साथ अटक नहीं गए हैं।

+2

उपयोगी होगा अगर आपने यह दिखाया कि यह कैसे करें। क्या आप एक उदाहरण जोड़ सकते हैं? – slm

1

कई लोगों ने यहां तर्क दिया कि तिथियों का मूल प्रारूप yyyy-mm-dd प्रारूप में होना चाहिए, लेकिन किसी ने भी पर्ल कोड नहीं दिया है जो अभी तक उस मामले को संभाल सकता है। तो यहां यह है:

my @dates = (
    '2014-08-15', 
    '2016-09-13', 
    '2001-01-02', 
    '1998-09-22', 
    '1998-09-21', 
    '1998-09-23', 
    '1999-04-20', 
    '2020-01-30', 
); 

@dates = sort {$a cmp $b} @dates; # 1998 is the first date's year 
@dates = sort {$b cmp $a} @dates; # 2014 is the first date's year 
+0

ब्रैड गिल्बर्ट के उत्तर में उस मामले के लिए कोड शामिल है। यह सिर्फ '@dates = sort @dates;' है। – melpomene

+0

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

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

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