【问题标题】:Perl Sort Hash of ArraysPerl 对数组进行哈希排序
【发布时间】:2012-01-21 20:13:58
【问题描述】:

我有一个如下所示的数组哈希:

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

我正在尝试按数组的第二个值进行数字排序并打印出整个散列。我看过 Schwartzian Transform 的帖子,但我还没有看到一个完全符合我要求的帖子。我也对语法以及如何将排序后的值映射回原始{$key, [$val1, $val2] } 表单感到非常困惑。任何帮助将不胜感激!

【问题讨论】:

  • 1 比 4,确定吗? (不是这样更好!)
  • @davorg 5 个问题,1 个被接受。不知道 SO 是如何计算这个比率的,它确实看起来很奇怪。
  • 施瓦茨变换处理计算值的排序。您想为每个元素计算它们 once 而不是 2 * nlogn 次。您已经有了要在计算出的$hash->{ $key }[1] 上排序的值。您不需要 Schwartzian 变换。
  • @TLP 在计算中使用新问题之前有一定的延迟。
  • 在您全面了解Perl 之前,请勿尝试使用Schwartzian Transform

标签: arrays perl sorting hash


【解决方案1】:

不太清楚您指的是什么,但这是您在哈希内对数组值实现排序例程的方式:

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";
}

【讨论】:

  • 完美,就像一个魅力。谢谢!我仍然习惯这种语法,如果这似乎是一个基本问题,请道歉。
【解决方案2】:

我真的想使用 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。

【讨论】:

  • 我们真的需要 Schwartzian 变换吗?不像$hash{$_}-&gt;[1] 是一项昂贵的操作。
  • @TLP:OP 专门询问了 Schwartzian 变换,所以我认为他得到了一个实现示例。不过,我确实认为算法应该附带对特定情况的解释,因为这些类型的表达式对于 Perl 新手来说可能有点吓人。
  • @flesk 人们要求各种他们不需要的疯狂的东西。 =P 使用他的数据,Schwartzian Transform 实际上增加了成本。我想展示它是正确的,但最好提一下在这种情况下不需要它。
  • @TLP:确实如此。现在的答案更好。
  • 感谢您的澄清,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
相关资源
最近更新 更多