5

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

asdadasBBBsfasdasdas-0112
asdanfnfnfnfnf222ads-1210

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

有什么好的策略吗??

谢谢,

4

5 回答 5

5

施瓦茨变换怎么样:

#!/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-20T13:31:33.230 回答
5

施瓦茨变换在这里将是巨大的浪费。这个我永远记不起名字的类似结构会更好。

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-20T17:12:18.307 回答
2

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

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,因为所有值实际上都表示数字。

于 2012-05-20T13:02:39.977 回答
0

感谢@M42 提供示例数据。

use strict;
use warnings;
use feature 'say';

my @list = (
    'asdadasBBBsfasdasdas-0112',
    'asdanfnfnfnfnf222ads-1210',
    'asdanfnfnfnfnf222ads-1211',
    'asdanfnfnfnfnf222ads-1010',
    'asdanfnfnfnfnf222ads-1011',
);

my @sorted = sort {
  my ($aa, $bb) = map { /(..)(..)\z/ and $2.$1 } $a, $b;
  $aa <=> $bb;
} @list;

say for @sorted;

输出

asdanfnfnfnfnf222ads-1010
asdanfnfnfnfnf222ads-1210
asdanfnfnfnfnf222ads-1011
asdanfnfnfnfnf222ads-1211
asdadasBBBsfasdasdas-0112
于 2012-05-20T16:20:35.647 回答
0

把它改成几个月怎么样?例如:

812 = 12 * 12 + 8

113 = 13 * 12 + 1

你可以把几年变成几个月,这会很好。要选择数字,您可以使用正则表达式。

于 2012-05-20T13:03:28.193 回答