perl 排名数字与平局/平局
perl ranking numbers with tie / draws
我有一个整数数组,但这不是1,2,3,4,5等的典型排序。如果整数具有相同的值,则排序也是相同的值。示例 1、2、2、4、5。但是,我们需要相应地填补队伍。所以跳过等级 3,因为有两个 2。
1,2,3,3,5 而不是 1,2,3,3,4
整数数组可以是几千个,因此高效的算法将是理想的。最好能用 perl 写成一个可以给定输入的函数。
整数数组 = 1000,2000,3000,3000,3500
会得到结果 = 1,2,3,3,5
另一个例子
整数 = 100,200,200,200,300,400,500,500,1000,2000
排名 = 1,2,2,2,5,6,7,7,9,10
这个怎么样:
use strict;
my @test = (100,200,200,200,300,400,500,500,1000,2000);
my @sorted = sort {$a <=> $b} @test;
my $rank = 1;
my @ranks;
foreach my $count (0..$#sorted) {
$rank = $count + 1 if ($count > 0 && $sorted[$count] != $sorted[$count - 1]);
push @ranks, $rank;
}
print join ",", @ranks;
您可以使用散列来记住 @integers
数组中重复值的位置,
use strict;
use warnings;
my @integers = sort {$a <=> $b} (100,200,200,200,300,400,500,500,1000,2000);
my %seen;
my @rank = map { $seen{$integers[$_]} //= $_+1 } 0 .. $#integers;
# same as
# my @rank = map { $seen{$integers[$_]} //= $_+1; $seen{$integers[$_]} } 0 .. $#integers;
use Data::Dumper; print Dumper \@rank;
输出
$VAR1 = [
1,
2,
2,
2,
5,
6,
7,
7,
9,
10
];
我有一个整数数组,但这不是1,2,3,4,5等的典型排序。如果整数具有相同的值,则排序也是相同的值。示例 1、2、2、4、5。但是,我们需要相应地填补队伍。所以跳过等级 3,因为有两个 2。
1,2,3,3,5 而不是 1,2,3,3,4
整数数组可以是几千个,因此高效的算法将是理想的。最好能用 perl 写成一个可以给定输入的函数。
整数数组 = 1000,2000,3000,3000,3500
会得到结果 = 1,2,3,3,5
另一个例子
整数 = 100,200,200,200,300,400,500,500,1000,2000
排名 = 1,2,2,2,5,6,7,7,9,10
这个怎么样:
use strict;
my @test = (100,200,200,200,300,400,500,500,1000,2000);
my @sorted = sort {$a <=> $b} @test;
my $rank = 1;
my @ranks;
foreach my $count (0..$#sorted) {
$rank = $count + 1 if ($count > 0 && $sorted[$count] != $sorted[$count - 1]);
push @ranks, $rank;
}
print join ",", @ranks;
您可以使用散列来记住 @integers
数组中重复值的位置,
use strict;
use warnings;
my @integers = sort {$a <=> $b} (100,200,200,200,300,400,500,500,1000,2000);
my %seen;
my @rank = map { $seen{$integers[$_]} //= $_+1 } 0 .. $#integers;
# same as
# my @rank = map { $seen{$integers[$_]} //= $_+1; $seen{$integers[$_]} } 0 .. $#integers;
use Data::Dumper; print Dumper \@rank;
输出
$VAR1 = [
1,
2,
2,
2,
5,
6,
7,
7,
9,
10
];