我们说我在哈希中存储了以下信息:
kiwi 15
oranges 25
cherries 30
apples 2
pears 1
我想编写将以降序(按金额)前3个条目显示的代码。 所以输出应该是
cherries 30
oranges 25
kiwi 15
我似乎无法找到明确的答案。
答案 0 :(得分:5)
这会按照你的要求行事。它使用sort
和比较块,以相反的顺序比较每个键的对应散列值。然后打印前三个排序键中的每一个以及来自散列的值。
请注意,如果有多个具有相同最高值的哈希元素,则此代码将从共享相同值的那些元素中打印出任意三个元素
use strict;
use warnings;
my %data = qw/
kiwi 15
oranges 25
cherries 30
apples 2
pears 1
/;
my @sorted_keys = sort { $data{$b} <=> $data{$a} } keys %data;
for my $key ( @sorted_keys[0..2] ) {
print "$key $data{$key}\n";
}
<强>输出强>
cherries 30
oranges 25
kiwi 15
<强>更新强>
对于更通用的解决方案,(非核心)List::UtilsBy
模块提供了许多实用功能,它们根据对象列表提供排序,最大值和最小值。它让我把上面的内容写成
use List::UtilsBy qw/ nsort_by /;
my @sorted_keys = nsort_by { $data{$_} } keys %data;
for my $key ( (reverse @sorted_keys)[0..2] ) {
print "$key $data{$key}\n";
}
或者,如果你喜欢在另一个地方反向
use List::UtilsBy qw/ rev_nsort_by /;
my @sorted_keys = rev_nsort_by { $data{$_} } keys %data;
for my $key ( @sorted_keys[0..2] ) {
print "$key $data{$key}\n";
}
观察模块sort_by
和nsort_by
之间的差异分别等同于cmp
和<=>
比较运算符之间的差异。
这两种选择都产生与上述原始相同的输出