perl - 查找与特定键匹配的嵌套哈希值

标签 perl hash hashmap

我在 perl 中创建了一个散列的散列,这是一个散列最终看起来像的例子:

my %grades;
$grades{"Foo Bar"}{Mathematics}   = 97;
$grades{"Foo Bar"}{Literature}    = 67;
$grades{"Peti Bar"}{Literature}   = 88;
$grades{"Peti Bar"}{Mathematics}  = 82;
$grades{"Peti Bar"}{Art}          = 99;

为了打印整个散列,我正在使用:

foreach my $name (sort keys %grades) {
    foreach my $subject (keys %{ $grades{$name} }) {
        print "$name, $subject: $grades{$name}{$subject}\n";
    }
}

我只需要打印引用“Peti Bar”的内部散列并找到最高值,所以理论上,我应该只解析 Peti Bar,Literature; Peti Bar,数学;和 Peti Bar,Art 并最终返回 Art,因为它具有最高的值(value)。 有没有办法做到这一点,或者我是否需要解析整个 2d 哈希?

最佳答案

如果您知道您感兴趣的 key ,则无需解析第一级。只需省略第一个循环并直接访问它。要获得最高值(value),您必须对每个主题都看一遍。

跟踪最高值和与之对应的键,然后打印。

my $max_value = 0;
my $max_key;
foreach my $subject (keys %{ $grades{'Peti Bar'} }) {
    if ($grades{'Peti Bar'}{$subject} > $max_value){
        $max_value = $grades{'Peti Bar'}{$subject};
        $max_key = $subject;
    }
}
print $max_key;

这将输出

Art

使用 sort 的替代实现如下所示:

print +(
    sort { $grades{'Peti Bar'}{$b} <=> $grades{'Peti Bar'}{$a} }
        keys %{ $grades{'Peti Bar'} }
)[0];

+( ... ) 中的 + 告诉 Perl 括号 () 不是用于函数调用 print,而是构造一个列表。 sort 对键进行降序排序,因为它首先是 $b。它返回一个列表,我们取第一个值(索引 0)。

请注意,这比第一个实现更昂贵,而且不一定更简洁。除非你正在构建一个单行或你的 ; 坏了我不会推荐第二种解决方案。

关于perl - 查找与特定键匹配的嵌套哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42739255/

相关文章:

regex - 如何使用 Perl 检查标量中是否包含已编译的正则表达式?

java - MD5 签署 HttpServletResponse

Java/HashMap/性能

java - 如何从 HashMap 的 ArrayList 获取特定值

mysql - 用于连接到 mysql 服务器端口 3307 的 perl 脚本

Perl 异或返回意外结果

perl - perl 中有什么好的收集模块吗?

c++ - 如何在 XCode、C++ 中使用 ext、tr1 或 __gnu_cxx #include hash

java - 碰撞分辨率 : Quadratic Probing vs. 单独链接

Java将Hashmap放入Treemap