2013-12-17 34 views
-2

使用Perl,我有一个环比与此类似:存储和打印散列的哈希在Perl

%HoH = (
'A' => { 
        'a' => 4, 
        'b' => 18, 
        'c' => 2 
       }, 
'B' => { 
        'a' => 1, 
        'b' => 2 
       }, 
'C' => { 
        'a' => 1 
       }, 
'D' => { 
        'a' => 1, 
        'b' => 2, 
        'c' => 5, 
        'd' => 9 
       }, 
    #........ on and on and on ..... 
); 

对于每个资本键,我想打印有一个小写的关键与其相关的最大价值。

示例输出:

b,b,a,d... 

在这一点上的任何方向将被理解的是,新的游戏。

+0

这是非常简单的通过与像'而(($键,$ VAL)=每%哈希){...}'哈希迭代。然后,您只需检查每个键的值并记住所看到的最高值。 –

+1

堆栈溢出不是开始学习编程的好地方。我们来回答具体的问题,而不是“嘿,我刚刚开始,谁能帮助我?”寻找一些在线教程,或者一个刚刚入门的新手社区。 – user1618143

+0

想象这是一个足够具体的问题,我无法在网络上的其他地方找到此信息。感谢那些提供建议和提示的人。 – danimal

回答

0

例如:

for my $k (sort keys %HoH) { 
    my $h = $HoH{$k}; 
    my $g= (sort {$h->{$b} <=> $h->{$a}} keys %$h)[0]; 
    print "$k: $g \n"; 
} 

(您的原始输出没有太大的意义,因为%HoH按键的顺序不是固定的)

+0

这是一个不错的简洁解决方案。如果我们不知道问题空间有多大,我可能会避免排序 - 如果他需要在数十万个密钥的散列上执行此操作,那么这可能会大大影响性能。 –

+0

谢谢。输出顺序无关紧要,我只是命令它试图解决问题的关键点。 – danimal

+2

使用类似'List :: Util :: max()'的函数会更快,它运行在O(N)中,而不是排序哪个是O(NlogN)。 – AKHolland

1
use List::Util qw(reduce); 

for my $k1 (sort keys %HoH) { 
    my $h = $HoH{$k1}; 
    my $k2 = reduce { $h->{$a} > $h->{$b} ?$a :$b } keys %$h; 

    print "$k1, $k2\n"; 
} 
0

使用列表::的Util的减少;

use List::Util qw(reduce); 

use strict; 
use warnings; 

my %HoH = ... 

for my $k (sort keys %HoH) { 
    my $h = $HoH{$k}; 

    my $maxKey = reduce {$h->{$a} > $h->{$b} ? $a : $b} keys %$h; 

    print "$k -> $maxKey\n"; 
}