2013-12-17 33 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"; 
}