perl排名带/平的数字

我有一个整数数组,但这不是1,2,3,4,5等的典型排名。如果整数具有相同的值,排名也是相同的值。例1,2,2,4,5。但是,我们需要相应地填补这些级别。所以跳过等级3是因为有两个2。的perl排名带/平的数字

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

回答:

您可以使用哈希要记住在@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

];

回答:

如何:

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;

以上是 perl排名带/平的数字 的全部内容, 来源链接: utcz.com/qa/266987.html

回到顶部