как получить все индексы максимальных повторяющихся значений в массиве в perl

#arrays #perl

#массивы #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. Мой код предоставляет мне только первый найденный индекс с максимальным значением.

Как я могу получить весь индекс, который имеет максимальное значение с ними?

Комментарии:

1. Присвоите результат grep массиву вместо скалярного параметра

Ответ №1:

 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"

Ответ №2:

Это один раз через массив для определения максимального значения и всех индексов:

     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. Однако для списка отрицательных чисел это не сработает. Вместо этого используйте число из массива.