2015-02-23 263 views
-3

我有一个整数数组,但这不是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

+4

问题是什么? – 2015-02-23 15:41:23

回答

1

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

刚刚尝试过2000个整数,结果是即时的。优秀。 – 2015-02-23 16:48:36

0

如何:

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;