【问题标题】:Perl: Sorting multi dimensional hashPerl:对多维哈希进行排序
【发布时间】:2013-12-04 21:52:16
【问题描述】:

我目前正在尝试按多维哈希中的值进行排序,但我有点难过。

我在单个级别上完成了如下操作:

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

有什么想法吗?

【问题讨论】:

    标签: perl sorting hash multidimensional-array


    【解决方案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的切换顺序替换了reverse。)

    【讨论】:

    • 某些情况下可能有多个 $intKey 和多个 $stringKey 是的。
    • 谢谢,工作完成了。我会去看看我认为的地图功能。我不能投票抱歉,因为我没有 15 个代表 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    相关资源
    最近更新 更多