2015-02-23 989 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;