Arrays 数组的Perl排序散列

Arrays 数组的Perl排序散列,arrays,perl,sorting,hash,Arrays,Perl,Sorting,Hash,我有一组数组,如下所示: { $key, [$val1, $val2] } 我尝试按数组的第二个值进行数字排序,并打印出整个散列。我已经看过了Schwartzian变换的帖子,但是我还没有看到一个完全符合我的要求的帖子。我还对语法以及如何将排序后的值映射回原始的{$key,[$val1,$val2]}表单感到非常困惑。任何帮助都将不胜感激 不太确定您指的是什么,但这就是如何在散列中对数组值实现排序例程的方法: my %hash = ( 'key1' => [ 1, 2 ], 'key2'

我有一组数组,如下所示:

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

我尝试按数组的第二个值进行数字排序,并打印出整个散列。我已经看过了Schwartzian变换的帖子,但是我还没有看到一个完全符合我的要求的帖子。我还对语法以及如何将排序后的值映射回原始的
{$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";
}
my%hash=('key1'=>[1,2],'key2'=>[2,3]);
对于我的$key(排序{$hash{$a}[1]$hash{$b}[1]}键%hash){
打印“$key=>”,join(“,”,@{$hash{$key}),“'\n”;
}

如果您真的想使用Schwartzian变换,以下是一种方法:

#!/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]};
}
NB:

k3 => [5, 1]
k1 => [1, 2]
k2 => [24, 5]
我只是给出这个答案作为施瓦茨变换的一个例子


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

1/4,当然?(这倒不是更好!)@davorg 5个问题,1个被接受。不知道如何计算这个速率,它看起来很奇怪。施瓦茨变换处理对计算值的排序。您希望为每个元素计算一次,而不是2*nlogn次。您已经有了要在计算的
$hash->{$key}[1]
上排序的值。您不需要Schwartzian变换。@TLP在计算中使用新问题之前会有一定的延迟。在您了解更多一般情况之前,不要尝试使用。我们真的需要Schwartzian变换吗?这不像
$hash{$\u}->[1]
是一个昂贵的操作。@TLP:OP专门询问了一个Schwartzian变换,所以我认为他得到了一个实现示例。然而,我确实认为,算法应该附带对具体情况的解释,因为对于Perl新手来说,这些类型的表达式可能有点吓人。@flesk人要求各种他们不需要的疯狂的东西=P利用他的数据,施瓦茨变换实际上增加了成本。我想展示它是正确的,但在这种情况下,它是不需要的,这将是一个好主意。@TLP:这是真的。现在的答案更好。感谢您的澄清,非常感谢!完美,就像一种魅力。谢谢我还在习惯这种语法,所以如果这是一个基本的问题,我道歉。