【问题标题】:How to sort hash of arrays by array size如何按数组大小对数组的哈希进行排序
【发布时间】:2013-06-03 18:12:47
【问题描述】:

我有一个数组哈希,我想按数组大小对它们进行排序。

到目前为止,这是我的代码:

use strict;
use warnings;

my %hash_array = (
    "array_1" => ["apple", "ball", "cat"],
    "array_2" => ["def", "leppard", "rocks", "too"],
    "array_3" => ["italian", "pastry", "missing", "cherry", "top"],
);

# Length of array_1
my $array_1_size = @{$hash_array{"array_1"}};
print "Should print three: $array_1_size\n";

# Found this here: https://stackoverflow.com/questions/15722286
# But my result remains unsorted
foreach my $key ( sort { $hash_array{$b} <=> $hash_array{$a}} keys %hash_array ) {
    print "key: $key\n";
}

我了解如何获取单个数组的大小,但我不确定如何将其与排序函数结合使用。

我从 here 复制了最后一个 foreach 块,但该解决方案对我不起作用,因为我的输出没有排序。我对最后一段代码有一些疑问:

  1. 我没有看到前面提到的 $b 和 $a。这是排序函数可以理解的内置引用吗?
  2. 该解决方案似乎适用于原始海报,但不适用于我的情况。然而,我们最初的目标是相似的。为了获得基于数组大小的有序输出,我缺少什么?
  3. 按数组大小升序和降序对数组哈希进行排序的最佳方法是什么?

【问题讨论】:

  • 如果您查看您引用的问题,发帖者会说“我不知道为什么这不起作用” 关于您复制的代码。他接受的答案是你应该复制的。

标签: perl


【解决方案1】:

你很亲密。如所写,您正在比较数组引用,它们或多或少是内存地址。我稍微修改了您的代码,以便为您提供所需的内容:

foreach my $key ( sort { scalar(@{$hash_array{$b}}) <=> scalar(@{$hash_array{$a}}) } keys %hash_array ) {
    print "key: $key\n";
}

【讨论】:

  • 太棒了!我知道这是一件小事。谢谢:)
  • 不需要调用scalar,因为&lt;=&gt; 运算符应用标量上下文。 @{$hash_array{$b}} &lt;=&gt; @{$hash_array{$a}} 很好。
【解决方案2】:

排序函数就是这样 - 一个匿名子。您不限于单个比较,您只需要以返回 -1、0 或 1 的结果结束。是的,$a$b 是要比较的两个值 - 它们可以是标量或引用。

你可以这样解决你的问题:

foreach my $key (sort { 
                        my $length_a = scalar @{$hash_array{$a}};
                        my $length_b = scalar @{$hash_array{$b}};
                        $length_b <=> $length_a
                      } keys %hash_array) {
    ...
}

我知道这可以简化为单行,但重点是展示如何在 sort 子中进行多个比较。

【讨论】:

  • 故意无用地用于教育目的。 :-) 我看到接受的答案正是我的答案,没有任何上下文或解释。
【解决方案3】:
for my $key (sort{ my ($x,$y)=@hash_array{$a,$b}; @$y <=> @$x } keys %hash_array) {

    print "key: $key\n";
}

【讨论】:

    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2019-04-25
    • 2020-10-14
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    相关资源
    最近更新 更多