使用Perl对数组的哈希进行排序

时间:2018-08-26 18:01:49

标签: perl

my %Hash = ( 

   1111 => [5,6] ,
   5555 => [3,4],   
   2222 => [3],
   4444 => [3,1]

)

如何按值对哈希进行升序排序,以便所有值都应显示为排序,但如果元素相等,则键的排序应为降序。

< p>

   <p>  Output:  
    1111 => 6
            5,

    5555 => 4
            3 ,

    4444 => 3
            1 ,

    2222 => 3
</p>

1 个答案:

答案 0 :(得分:3)

我不知道您对降序的含义。你能举个例子吗?我将按照您显示的输出进行操作。

我假设您不想更改原始数据(情况可能并非如此),所以我使用map-sort创建了一个中间数据。我按顺序查看该中间结果,并进行一些巧妙的操作以得到所需的结果。许多丑陋之处在于让您获得所需的格式。

postfix dereference在这里很有用:

use v5.26;
use utf8;
use strict;
use warnings;

my %Hash = (
   1111 => [5,6],
   5555 => [3,4],
   2222 => [3],
   4444 => [3,1]
);


foreach my $tuple (
    sort {
        $b->[1][0] <=> $a->[1][0]
        }
    map {
        [ $_, [ sort { $b <=> $a } $Hash{$_}->@* ] ];
        }
    keys %Hash
    ) {
    print my $string = "$tuple->[0] => ";
    my $indent = length $string;
    foreach my $i ( 0 .. $tuple->[1]->$#* ) {
        print ' ' x $indent if $i;
        print $tuple->[1][$i];
        print ',' if $i == $tuple->[1]->$#*;
        print "\n";
        }
    }

这将产生:

1111 => 6
        5,
5555 => 4
        3,
4444 => 3
        1,
2222 => 3,