2013-11-20 95 views
2

我目前正在尝试按多维散列中的值进行排序,并且我有点难倒了。Perl:排序多维散列

我如下的单一层面做到了这一点:

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 

任何想法?

+0

'perldoc -q sort' – toolic

回答

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。)

+0

某些情况下可能有多个$ intKey和multip le $ stringKey是。 – user3014345

+0

谢谢,更新我的回答 – ysth

+0

谢谢,这是完成这项工作。我会去看看我认为的地图功能。我不能upvote对不起,因为我没有15代表:( – user3014345