问题从Perl的数组中获得超过1个元素且出现次数最高

时间:2019-07-04 03:05:06

标签: arrays perl find-occurrences

尽管只有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 个答案:

答案 0 :(得分:2)

max_by from 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 :(得分:1)

您的代码仅采用在排序数据中找到的第一个最大值。您需要继续读取数组元素,直到达到不再最大的元素为止。

但是,由于您可能必须测试所有哈希值,因此对它进行排序没有太大的优势。您可以遍历它并跟踪找到的最大值。

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不是有效的哈希键-它会转换为""