Perl:排序多维哈希

时间:2013-11-20 18:19:46

标签: perl sorting hash multidimensional-array

我目前正在尝试按多维哈希中的值排序,而且我有点难过了。

我在一个级别上完成了以下操作:

my %exampleHash = ();
$exampleHash{1}{value} = 10;
$exampleHash{2}{value} = 30;
$exampleHash{3}{value} = 0;
$exampleHash{4}{value} = 20;

foreach my $key ( reverse sort {$exampleHash{$a}{value} <=> $exampleHash{$b}{value}} keys %exampleHash )
{
    printf( "%s => %d\n", $key, $exampleHash{$key}{value} );
}

这将产生以下输出,按预期值对其进行排序:

2 => 30
4 => 20
1 => 10
3 => 0

然后我尝试了以下操作来做同样的事情,但是有一个额外的键:

my %exampleHashTwo = ();

$exampleHashTwo{1}{"One"}{value} = 10;
$exampleHashTwo{2}{"Two"}{value} = 30;
$exampleHashTwo{3}{"Three"}{value} = 0;
$exampleHashTwo{4}{"Four"}{value} = 20;

foreach my $intKey ( keys %exampleHashTwo )
{
    foreach my $stringKey ( reverse sort {$exampleHashTwo{$intKey}{$a}{value} <=> $exampleHashTwo{$intKey}{$b}{value}} keys %{$exampleHashTwo{$intKey}} )
    {
        printf( "{%d} - {%5s} => %d\n", $intKey, $stringKey, $exampleHashTwo{$intKey}{$stringKey}{value} );
    }
}

然而,这似乎按字母顺序对字符串键进行排序。所以我假设我在正确的路线上,但我可能错放了一些东西?

{4} - { Four} => 20
{1} - {  One} => 10
{3} - {Three} => 0
{2} - {  Two} => 30

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

你的外部循环以某种随机的顺序循环遍历整数键,它决定了输出的顺序。内循环正在排序,但每次只给出一个值。

要对两个键的所有组合的所有值进行排序,您需要一个循环并对生成的此类组合列表进行排序:

use strict;
use warnings;
my %exampleHashTwo = ();

$exampleHashTwo{1}{"One"}{value} = 10;
$exampleHashTwo{2}{"Two"}{value} = 20;
$exampleHashTwo{2}{"TwoB"}{value} = 5;
$exampleHashTwo{3}{"Three"}{value} = 0;
$exampleHashTwo{4}{"Two"}{value} = 15;

for my $keypair (
        sort { $exampleHashTwo{$b->[0]}{$b->[1]}{value} <=> $exampleHashTwo{$a->[0]}{$a->[1]}{value} }
        map { my $intKey=$_; map [$intKey, $_], keys %{$exampleHashTwo{$intKey}} } keys %exampleHashTwo
    ) {
    printf( "{%d} - {%5s} => %d\n", $keypair->[0], $keypair->[1], $exampleHashTwo{$keypair->[0]}{$keypair->[1]}{value} );
}

输出:

{2} - {  Two} => 20
{4} - {  Two} => 15
{1} - {  One} => 10
{2} - { TwoB} => 5
{3} - {Three} => 0

(替换为$a$b的切换顺序。)