Проблема получить более 1 элемента с одинаковым наивысшим вхождением из массива в Perl - PullRequest
0 голосов
/ 04 июля 2019

Я получаю только меньший элемент в качестве выходных данных, хотя в массиве есть 2 элемента с самым высоким вхождением

Я пытался удалить функцию сортировки из кодов, но она все равно возвращает мне меньший элемент

my(@a) = (undef,11,12,13,14,15,13,13,14,14); 
my(%count); 
foreach my $value (@a) { 
  $count{$value}++; 
}
$max_value = (sort {$count{$b} <=> $count{$a}} @a)[0]; 
print "Max value = $max_value, occur $count{$max_value} times\n";

Ожидаемый результат: максимальное значение = 13 14, встречается 3 раза

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

max_by из List :: UtilsBy вернет все значения, которые имеют максимум в контексте списка.

use strict;
use warnings;
use List::UtilsBy 'max_by';

my @a = (undef,11,12,13,14,15,13,13,14,14);
my %count;
$count{$_}++ for @a;
my @max_values = max_by { $count{$_} } keys %count;
1 голос
/ 04 июля 2019

Ваш код просто принимает первое максимальное значение, которое он находит в отсортированных данных.Вам нужно продолжать чтение элементов массива, пока не достигнете элемента, который больше не является максимальным.

Однако, поскольку вам, вероятно, придется проверять все значения хеш-функции, нет большой пользы для сортировки.Вы можете просто пройти его и отследить максимальное найденное значение (я).

my @a = (undef,11,12,13,14,15,13,13,14,14);

my %count;
$count{$_}++ for @a;

my ($max_count, @max_values);
while ( my ($k,$v) = each %count) {
    if ($v > $max_count) {
        @max_values = ($k);
        $max_count = $v;
    }
    elsif ($v == $max_count) {
        push @max_values, $k;
    }
}

my $max_values = join " ", sort @max_values;

print "Max value = $max_values, occur $max_count times\n";

Обратите внимание, что undef не является действительным хеш-ключом - он преобразуется в "".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...