【问题标题】:Dynamically sorting array of hash by multiple keys in perl在perl中通过多个键动态排序哈希数组
【发布时间】:2014-08-01 00:40:02
【问题描述】:

在寻找一些指针时,关于如何按多个值对哈希数组进行排序,我遇到了以下解决方案: Sorting array of hash by multiple keys.

但是,似乎无法找到动态执行此操作的方法。

假设一个人想要排序的参数数量(这里:哈希键)取决于用户输入。

使用与用户在链接问题中使用的相同示例:

$arr_ref = [ { 'brand' => 'A',
           'supplier' => 'X',
           'PO' => '2'
          },
          { 'brand' => 'B',
            'supplier' => 'Y',
            'PO' => '1'       
          },
          { 'brand' => 'B',
            'supplier' => 'X',
            'PO' => '2'           
          },
          { 'brand' => 'A',
            'supplier' => 'X',
            'PO' => '1'
          },
          { 'brand' => 'B',
            'supplier' => 'X',
            'PO' => '1'           
          }

];

用户可以提供他们是否希望仅按“品牌”、“品牌”和“供应商”或全部三个排序。

【问题讨论】:

    标签: perl


    【解决方案1】:

    创建一个执行排序的子例程。它接受任意数量的键来进行比较:

    use strict;
    use warnings;
    
    my @array = (
        { 'brand' => 'A', 'supplier' => 'X', 'PO' => '2' },
        { 'brand' => 'B', 'supplier' => 'Y', 'PO' => '1' },
        { 'brand' => 'B', 'supplier' => 'X', 'PO' => '2' },
        { 'brand' => 'A', 'supplier' => 'X', 'PO' => '1' },
        { 'brand' => 'B', 'supplier' => 'X', 'PO' => '1' },
    );
    
    sub custom_sort {
        my ($x, $y, @keys) = @_;
        for (@keys) {
            my $cmp = $x->{$_} cmp $y->{$_};
            return $cmp if $cmp;
        }
        return 0;
    }
    
    my @sorted = sort {custom_sort($a, $b, 'brand', 'supplier', 'PO')} @array;
    
    use Data::Dump;
    dd @sorted;
    

    输出:

    (
      { brand => "A", PO => 1, supplier => "X" },
      { brand => "A", PO => 2, supplier => "X" },
      { brand => "B", PO => 1, supplier => "X" },
      { brand => "B", PO => 2, supplier => "X" },
      { brand => "B", PO => 1, supplier => "Y" },
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 2015-08-21
      • 2011-12-16
      • 2012-01-21
      • 1970-01-01
      相关资源
      最近更新 更多