【问题标题】:Sorting Hash of Hashes by value按值对散列的散列进行排序
【发布时间】:2013-04-22 02:43:45
【问题描述】:

我有以下数据结构

my %HoH = {
      'foo1' => {
                        'bam' => 1,
                        'zip' => 0,
                      },
      'foo2' => {
                         'bam' => 0,
                         'zip' => 1,
                         'boo' => 1
                       }
    };

我想按照 'zip' 中存储的 VALUE 从大到小对 KEY1(foo1 或 foo2)进行排序。

这就是我的做法。

use strict; use warnings;
use Data::Dumper;
my @sorted;
foreach my $KEY1 (keys %HoH) {
    # sort KEY1 by the value 'zip' maps to in descending order
    @sorted = sort {$HoH{$KEY1}{'zip'}{$b} <=> 
        $HoH{$KEY1}{'zip'}{$a}} keys %HoH;
}

print Dumper(\@sorted);

我收到了一个奇怪的警告:在 test.pl 第 6 行中找到了预期大小相同的列表的参考。 print Dumper(\@sorted); 也在打印中

$VAR1 = [
      'HASH(0x1b542a8)'
    ];

什么时候打印

$VAR1 = [
      ['foo2', 'foo1']
    ];

因为foo2 有1 个zipfoo1 有0 个zip

【问题讨论】:

  • 术语的关键点:您不能对哈希进行排序。哈希没有顺序。您可以做的是以给定顺序打印散列中的内容,但散列本身未排序。这与 PHP 数组不同,它们的作用类似于哈希,但也有排序顺序。

标签: arrays perl hash-of-hashes


【解决方案1】:
  • %HoH 被声明为散列,但被定义为散列引用。使用括号 (...) 而不是大括号 {...}
  • 您无需遍历哈希即可对其进行排序。排序会解决这个问题。
  • 如果您是sort {...} keys %HoH,那么特殊变量$a$b 代表%HoH 在执行排序时的键。
  • $a$b 的顺序相反,因为您的预期结果是降序的。 (更新:哦,我刚注意到你一开始就有这个。)
  • 嵌套散列中的zip 值为$HoH{$KEY}{'zip'},这是您应该排序的依据。

    use strict;
    use warnings;
    use Data::Dumper;
    
    my %HoH = (
          'foo1' => {
                            'bam' => 1,
                            'zip' => 0,
                          },
          'foo2' => {
                             'bam' => 0,
                             'zip' => 1,
                             'boo' => 1
                           }
        );
    
    my @sorted = sort {$HoH{$b}{'zip'} <=> $HoH{$a}{'zip'}} keys %HoH;
    print Dumper \@sorted;
    

注意,这段代码的结果会给你一个数组:

$VAR1 = [
      'foo2',
      'foo1'
];

...不是嵌套数组:

$VAR1 = [
     ['foo2', 'foo1']
];

【讨论】:

    猜你喜欢
    • 2014-05-07
    • 2014-01-08
    • 2012-10-09
    • 2015-01-26
    • 2010-11-02
    • 2014-07-03
    • 2023-03-25
    • 2014-05-19
    • 1970-01-01
    相关资源
    最近更新 更多