如何使用两个子字符串相等条件对字符串进行排序?
我有一个具有以下格式的字符串列表:
('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