首先按字母顺序排序,然后在串联密钥上进行数字排序

LKr*_*mer 1 sorting perl

给定一组Letter_Number组合,我如何先按字母排序,然后编号:

( B_5   A_11   C_0   A_10    A_1 )
Run Code Online (Sandbox Code Playgroud)

要得到:

( A_1   A_10   A_11   B_5    C_0 )
Run Code Online (Sandbox Code Playgroud)

?

kjp*_*ice 5

默认情况下,排序以词汇方式进行比较.因此,如果您想将数字视为010> 1和2 <11的实际数字,那么这更像您需要的:

my @list = qw(B_5 A_11 C_0 A_10 A_1);
my @sorted = sort char_then_num @list;

sub char_then_num {
    my ($a_char, $a_num) = split '_', $a;
    my ($b_char, $b_num) = split '_', $b;
    return $a_char cmp $b_char
             ||
        $a_num <=> $b_num;
}
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的缺点是它重复地分割某些元素,更重要的是,它具有重复的代码. (4认同)
  • @kjprice,https://gist.github.com/anonymous/5978996你的实际上它的分数更快(不是一个数量级,10.0微秒对10.8微秒),即使是更长的列表.ST的开销并没有弥补节省. (2认同)