如何在perl中获取数组中最大重复值的所有索引

时间:2011-11-13 04:02:17

标签: arrays 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.我的代码只提供了它找到的第一个索引,其中包含最大值。

如何获得具有最大值的所有索引?

2 个答案:

答案 0 :(得分:5)

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

似乎是最简单的方法。

虽然对于数字,你真的应该使用==,尽管例如100也是一个有效的字符串。

答案 1 :(得分: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);