Perl排序哈希数组



我有一个数组的哈希,看起来像这样:

{ $key, [$val1, $val2] }

我试图按数组的第二个值进行数字排序,并打印出整个哈希值。我看了一下Schwartzian Transform的帖子,但我还没有看到一个完全符合我想要的。我也很困惑的语法和如何映射排序值回到原来的{$key, [$val1, $val2] }形式。任何帮助将不胜感激!

不太确定您指的是什么,但这就是如何在散列中对数组值实现排序例程:

my %hash = ( 'key1' => [ 1, 2 ], 'key2' => [ 2, 3 ] );
for my $key ( sort { $hash{$a}[1] <=> $hash{$b}[1] } keys %hash ) {
    print "$key => '", join(", ", @{$hash{$key}}), "'n";
}

如果你真的想使用Schwartzian-Transform,这里有一个方法:

#!/usr/bin/perl
use Data::Dump qw(dump);
my %hash = (k1 => [1, 2], k2 => [24, 5], k3 => [5, 1]);
foreach(
        sort { $a->[1] <=> $b->[1] }
        map { [$_, $hash{$_}->[1] ] } keys %hash) {
    say $_->[0],' => ',dump$hash{$_->[0]};
}
输出:

k3 => [5, 1]
k1 => [1, 2]
k2 => [24, 5]

注:

我只是把这个答案作为施瓦茨变换的一个例子

但是正如在评论中所说的,在问题解释的情况下不需要它,当数组的每个元素在排序之前都有一些计算时,ST是节省成本的。对于所问的问题,没有计算要做,所以这里不要使用ST。

最新更新