2011-11-13 64 views
1

嗨,我是一名學習過程中的Perl新手。 我有一個數組如何在perl中獲得數組中最大重複值的所有索引

@array = (10, 40, 59, 40, 90, 100, 30, 40, 100, 20,); 

我想找到數組中的最大數,也想知道索引,其中,最大的號碼顯示在我的數組。

我做

my $maxValue = max @array; 
print $maxValue;  # displays the maximum number in the entire array 

my ($index) = grep $array[$_] eq $maxValue , 0.. $#array; 
print ($index);  # this gives me the index of the maximum number which was found in the array. 

我得到的輸出是100指數5

但實際上,100來了2倍在陣列中:一次是在指數6,再次在指數8.我代碼只能爲我提供第一個找到的最大值的索引。

我怎樣才能得到所有與他們有最大價值的指數?

+0

分配grep來排列的結果而不是標量變量 – SAN

回答

5
my @index = grep $array[$_] eq $maxValue , 0.. $#array; 
print @index; 

似乎是最簡單的方法。

儘管對於數字,您確實應該使用==,即使例如, 100也是一個有效的字符串。

+1

關於'=='和'eq'的更多信息。 '100 == 100.0E0'爲真,'100 eq 100.0E0'也是如此。但''100「==」100.0E0「'是真的,但不是'」100「eq」100.0E0「' – SAN

+0

非常感謝你。這是我的問題的一個快速解決方案。 – ssharma

+0

@SonamSharma不客氣。 – TLP

0

這是一次通過陣列來測定的最大值和所有的指標:

use warnings; 
    use strict; 
    use Data::Dumper; 

    my @array = (10, 40, 59, 40, 90, 100, 30, 40, 100, 20,); 
    my %uniq; 
    my $i = 0; 
    my $max = 0; 
    for (@array) { 
     push @{ $uniq{$_} }, $i; 
     $i++; 
     $max = $_ if $_ > $max; 
    } 
    print "max=$max at indexes:\n"; 
    print Dumper($uniq{$max}); 

    __END__ 

    max=100 at indexes: 
    $VAR1 = [ 
       5, 
       8 
      ]; 

另一種方式......沒有#:

use warnings; 
use strict; 
use Data::Dumper; 

my @array = (10, 40, 59, 40, 90, 100, 30, 40, 100, 20,); 
my @maxs; 
my $i = 0; 
my $max = 0; 
for (@array) { 
    if ($_ > $max) { 
     @maxs = $i; 
     $max = $_ ; 
    } 
    elsif ($_ == $max) { 
     push @maxs, $i; 
    } 
    $i++; 
} 
print "max=$max at indexes:\n"; 
print Dumper(\@maxs); 
+1

雖然不適用於負數的列表。改爲使用數組中的數字。 – TLP

相關問題