【问题标题】:How do I sort a perl hash by multiple keys?如何通过多个键对 perl 哈希进行排序?
【发布时间】:2016-04-22 07:34:34
【问题描述】:

您好,我有一个如下形式的数据结构:

$data = {                                                                                           
    'a' => { key1 => 2, key2 => 1 },                                                                   
    'b' => { key1 => 1, key2 => 2 },                                                                   
    'c' => { key1 => 1, key2 => 1 },                                                                   
    'd' => { key1 => 3, key2 => 2 },                                                                   
    'e' => { key1 => 3, key2 => 1 },                                                                   
    'f' => { key1 => 1, key2 => 2 },                                                                   
};

我想做的是以key2的升序,key1的降序,然后哈希键的升序循环遍历这个数据结构,例如:

e
a
c
d
b
f

如何在 perl 中实现这一点?我知道我可以使用 sort keys %$data 按键对哈希进行排序,但我如何按多个值和键排序?

【问题讨论】:

    标签: perl sorting hash


    【解决方案1】:

    之前有人问过类似的问题,可以在这里找到: Sorting an Array of Hash by multiple keys Perl

    基本上,Perl 有两个用于排序的运算符,<=>cmp,它们返回 -1、0 或 1,具体取决于左侧是小于、等于还是大于右侧。 <=> 用于数值比较,cmp 用于字符串比较。可以在此处找到有关其使用的更多详细信息:Equality Operators

    这些运算符可与 Perl 的 sort 函数一起使用,并与 or 运算符结合使用可实现您所追求的结果:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my $data = {
        'a' => { key1 => 2, key2 => 1 },
        'b' => { key1 => 1, key2 => 2 },
        'c' => { key1 => 1, key2 => 1 },
        'd' => { key1 => 3, key2 => 2 },
        'e' => { key1 => 3, key2 => 1 },
        'f' => { key1 => 1, key2 => 2 },
    };
    
    my @sorted = sort {
            $data->{$a}->{key2} <=> $data->{$b}->{key2} or
            $data->{$b}->{key1} <=> $data->{$a}->{key1} or
            $a cmp $b
        } keys %{$data};
    
    for my $key (@sorted){
        print "$key\n";
    }
    

    由于 &lt;=&gt;cmp 返回 0 (false) 表示相等,这意味着我们可以将相等检查与 or|| 链接在一起。

    在上面的示例中,我们 $a$b 在特定的排序迭代中引用 $data hashref 的键。使用这些键,我们可以访问哈希的特定值,例如$data-&gt;{$a}-&gt;{key2}。通过将$a 放在$b 之前,它将导致排序按升序排列,将$b 放在$a 之前将导致排序按降序排列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 2015-03-12
      • 2014-04-13
      • 2019-03-17
      • 2014-08-01
      相关资源
      最近更新 更多