首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按mmyy排序(月和年)

按mmyy排序(月和年)
EN

Stack Overflow用户
提问于 2012-05-20 20:55:44
回答 5查看 160关注 0票数 5

我正在寻找一个逻辑(而不是额外的模块)来按这样的格式排序。我有一个字符串列表,如下所示:

代码语言:javascript
复制
asdadasBBBsfasdasdas-0112
asdanfnfnfnfnf222ads-1210

我不能只按数字排序,例如: 812 > 113 (812 = 2012年8月,113 = 2013年1月,所以它是不正确的)

有什么好的策略吗??

谢谢,

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-21 01:12:18

在这里,schwartzian变换将是一个巨大的浪费。这个名字我永远记不住的类似的结构会更好。

代码语言:javascript
复制
my @sorted =
   map substr($_, 4),
    sort
     map substr($_, -2) . substr($_, -4, 2) . $_,
      @unsorted;

使用匹配运算符而不是substr

代码语言:javascript
复制
my @sorted =
   map substr($_, 4),
    sort
     map { /(..)(..)\z/s; $2.$1.$_ }
      @unsorted;
票数 5
EN

Stack Overflow用户

发布于 2012-05-20 21:31:33

Schwartzian transform怎么样?

代码语言:javascript
复制
#!/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;

输出:

代码语言:javascript
复制
(
  "asdanfnfnfnfnf222ads-1010",
  "asdanfnfnfnfnf222ads-1210",
  "asdanfnfnfnfnf222ads-1011",
  "asdanfnfnfnfnf222ads-1211",
  "asdadasBBBsfasdasdas-0112",
)
票数 5
EN

Stack Overflow用户

发布于 2012-05-20 21:02:40

使用排序函数,首先查看年份,然后查看日期:

代码语言:javascript
复制
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,因为所有的值实际上都表示数字。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10673588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档