如何使用两个子字符串相等条件对字符串进行排序?

我有一个具有以下格式的字符串列表:

('group1-1', 'group1-2','group1-9', 'group2-1','group2-2', 'group2-9','group1-10', 'group2-10' )

我需要将它们排序如下:

先分组,然后数字。

('group1-1', 'group1-2','group1-9','group1-10', 'group2-1','group2-2', 'group2-9', 'group2-10' )

我已经编写了以下代码,但它没有按预期工作:一个基于组排序的比较器,如果组匹配,则根据数字进行排序。

my @list = ('group1-1', 'group1-2','group1-9', 
'group2-1','group2-2', 'group2-9','group1-10', 'group2-10' );
@list = sort compare @list;
for (@list){
    print($_."n");
}

sub compare{
    my $first_group, $first_num = get_details($a);
    my $second_group, $second_num = get_details($b);
    if($first_group < $second_group){
      return -1;
   } elsif($first_group == $second_group){
      if ( $first_num < $second_num) {
         return -1;
      } elsif ( $first_num == $second_num ) {
         return 0;
      } else {
         return 1;
      }
   } else{
      return 1;                       
   }
}

sub get_details($){
   my $str= shift;
   my $group = (split /-/, $str)[0];
   $group =~ s/D//g;
   my $num = (split /-/, $str)[1];
   $num =~ s/D//g;
   return $group, $num;
}

回答

您可以使用Schwartzian 变换:

use warnings;
use strict;

my @list = ('group1-1', 'group1-2','group1-9', 
    'group2-1','group2-2', 'group2-9','group1-10', 'group2-10' );

@list = map  { $_->[0] }
        sort { $a->[1] cmp $b->[1] or $a->[2] <=> $b->[2] }
        map  { [$_, split /-/] }
        @list;

for (@list) {
    print($_."n");
}

印刷:

group1-1
group1-2
group1-9
group1-10
group2-1
group2-2
group2-9
group2-10


以上是如何使用两个子字符串相等条件对字符串进行排序?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>