2014-03-27 75 views
2

數據:的Perl:按值降序排序哈希散列

%HoH => (
abc => { 
      value => "12", 
}, 
xyz => { 
      number => "100", 
}, 
pqr => { 
      digit => "5", 
} 
) 

如何按降序排序值的哈希散列? 輸出

100 
12 
5 
+0

你總是隻在你內心的哈希一個鍵/值對? – ThisSuitIsBlackNot

+0

不,它可能是多個 – iDev

+1

那麼你怎麼知道要排序的值?相應的鍵是否總是被命名爲「數值」,「數字」或「數字」? – ThisSuitIsBlackNot

回答

0

我想出了這個解決方案

#!/usr/bin/perl 

use strict; 
use warnings; 

my %HoH = (
    abc => { 
       value => "12", 
    }, 
    xyz => { 
       number => "100", 
    }, 
    pqr => { 
       digit => "5", 
    } 
    ); 

my %rever; 
for my $TopKey(keys %HoH){ 
    for my $value(values %{ $HoH{$TopKey} }){ 
     push @{ $rever{$value} }, $TopKey; 
    } 
} 

my @nums = sort {$b <=> $a} (keys(%rever)); 

print $_, "\n" for @nums; 

我逆轉的情況下的值,你仍然需要使用密鑰名稱。

這是使用Dumper後的外觀。

$VAR1 = '100'; 
$VAR2 = [ 
      'xyz' 
     ]; 
$VAR3 = '12'; 
$VAR4 = [ 
      'abc' 
     ]; 
$VAR5 = '5'; 
$VAR6 = [ 
      'pqr' 
     ]; 
1

您無法對散列進行排序,它不會保留order。如果你想保留它們的排序,你必須根據數字對鍵進行排序並將鍵存儲在數組中。

#!/usr/bin/perl 
use strict; 
use warnings; 

my %HoH = (
       abc => { value => 12 }, 
       xyz => { value => 100}, 
       pqr => { value => 5}, 
       def => { value => 15}, 
       hij => { value => 30}, 
     ); 

my @sorted_keys = map { $_->[0] } 
      sort { $b->[1] <=> $a->[1] } # use numeric comparison 
      map { my $temp; 
       if (exists $HoH{$_}{'value'}) { 
         $temp = $HoH{$_}{'value'}; 
       } elsif (exists $HoH{$_}{'number'}) { 
         $temp = $HoH{$_}{'number'}; 
       } elsif (exists $HoH{$_}{'digit'}) { 
         $temp = $HoH{$_}{'digit'}; 
       } else { 
         $temp = 0; 
       } 
       {[$_, $temp]} } 
       (keys %HoH); 

for my $key (@sorted_keys) { 
     my $temp; 
     if (exists $HoH{$key}{'value'}) { 
       $temp = $HoH{$key}{'value'}; 
     } elsif (exists $HoH{$key}{'number'}) { 
       $temp = $HoH{$key}{'number'}; 
     } elsif (exists $HoH{$key}{'digit'}) { 
       $temp = $HoH{$key}{'digit'}; 
     } else { 
       $temp = 0; 
     } 
     print $key . ":" . $temp ."\n"; 
} 

輸出:

xyz:100 
hij:30 
def:15 
abc:12 
pqr:5 

此技術來進行排序稱爲Schwartzian Transform

0

給你實際上並沒有使用任何東西的鑰匙,您可以拼合的數據結構到一個單一的陣列,並在排序:

use strict; 
use warnings; 

my %HoH = (
    abc => {value => "12",}, 
    xyz => {number => "100",}, 
    pqr => {digit => "5",}, 
); 

my @numbers = sort {$b <=> $a} map {values %$_} values %HoH; 

print "$_\n" for @numbers; 

輸出:

100 
12 
5 

但是,如果你想要使用額外的關鍵信息,那麼你需要將你的哈希哈希值摺疊成一個數組,然後你可以按你喜歡的方式進行排序:

my @array; 
while (my ($k, $ref) = each %HoH) { 
    while (my ($k2, $v) = each %$ref) { 
     push @array, [$k, $k2, $v]; 
    } 
} 

@array = sort {$b->[2] <=> $a->[2]} @array; 

use Data::Dump; 
dd \@array; 

輸出:

[ 
    ["xyz", "number", 100], 
    ["abc", "value", 12], 
    ["pqr", "digit", 5], 
]