我正在寻找一个逻辑(而不是额外的模块)来按这样的格式排序。我有一个字符串列表,如下所示:
asdadasBBBsfasdasdas-0112
asdanfnfnfnfnf222ads-1210我不能只按数字排序,例如: 812 > 113 (812 = 2012年8月,113 = 2013年1月,所以它是不正确的)
有什么好的策略吗??
谢谢,
发布于 2012-05-21 01:12:18
在这里,schwartzian变换将是一个巨大的浪费。这个名字我永远记不住的类似的结构会更好。
my @sorted =
map substr($_, 4),
sort
map substr($_, -2) . substr($_, -4, 2) . $_,
@unsorted;使用匹配运算符而不是substr
my @sorted =
map substr($_, 4),
sort
map { /(..)(..)\z/s; $2.$1.$_ }
@unsorted;发布于 2012-05-20 21:31:33
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dump qw(dump);
my @list = (
'asdadasBBBsfasdasdas-0112',
'asdanfnfnfnfnf222ads-1210',
'asdanfnfnfnfnf222ads-1211',
'asdanfnfnfnfnf222ads-1010',
'asdanfnfnfnfnf222ads-1011',
);
my @sorted =
map { $_->[0] }
sort { $a->[1] <=> $b->[1] or $a->[2] <=> $b->[2] }
map { /-(\d\d)(\d\d)$/; [$_, $2, $1] } @list;
dump @sorted;输出:
(
"asdanfnfnfnfnf222ads-1010",
"asdanfnfnfnfnf222ads-1210",
"asdanfnfnfnfnf222ads-1011",
"asdanfnfnfnfnf222ads-1211",
"asdadasBBBsfasdasdas-0112",
)发布于 2012-05-20 21:02:40
使用排序函数,首先查看年份,然后查看日期:
sub mmyy_sorter {
my $a_yy = substr($a, -2);
my $b_yy = substr($b, -2);
my $a_mm = substr($a, -4, 2);
my $b_mm = substr($b, -4, 2);
return ($a_yy cmp $b_yy) || ($a_mm cmp $b_mm);
}
my @sorted = sort mmyy_sorter @myarray;注意:从技术上讲,这并不是很有效,因为它必须为每个比较重新计算月份和年子字段,而不是只为数组中的每个项目计算一次。
还可以利用Perl的自动类型转换并使用<=>操作符来代替cmp,因为所有的值实际上都表示数字。
https://stackoverflow.com/questions/10673588
复制相似问题