【问题标题】:How can I maintain a sorted hash in Perl?如何在 Perl 中维护已排序的哈希?
【发布时间】:2010-03-25 09:20:30
【问题描述】:
 @aoh =(
     {
        3 => 15,
        4 => 8,
        5 => 9,
     },
     {
        3 => 11,
        4 => 25,
        5 => 6,
     },
    {
        3 => 5,
        4 => 18,
        5 => 5,
    },
    {
        0 => 16,
        1 => 11,
        2 => 7,
    },
    {
        0 => 21,
        1 => 13,
        2 => 31,
     },
    {
        0 => 11,
        1 => 14,
        2 => 31,
    },
    );

我希望每个数组索引中的哈希值根据值以相反的顺序排序..

@sorted = sort { ......请填写这个............} @aoh;

预期输出

@aoh =(
 {
    4 => 8,
    5 => 9,
    3 => 15,
 },
 {
    5 => 6,
    3 => 11,
    4 => 25,
},
{
    5 => 5,
    3 => 5,
    4 => 18,
},
{
     2 => 7,
     1 => 11,
     0 => 16,
},
{
    1 => 13,
    0 => 21,
    2 => 31,
 },
{
    0 => 11,
    1 => 14,
    2 => 31,
},
);

请帮忙..提前谢谢.. 再次陈述我的要求:我只希望每个数组索引中的哈希值按值排序..我不希望对数组进行排序..

【问题讨论】:

    标签: perl sorting arrays hash


    【解决方案1】:

    Perl 哈希没有顺序。您必须将它们切换为数组,或者根据使用情况对它们进行排序(例如,当您需要迭代该哈希时)。

    第一个解决方案可能如下所示:

    @aoh =(
     [{ 4 => 8 }
    , { 5 => 9 },
    , { 3 => 15 }
     ],
    

    ...

    第二种解决方案是:

    foreach $subhash (@aoh) {
       foreach $sorted_key (sort { $subhash->{$a} <=> $subhash->{$b} } keys %$subhash) {
          # Do something with $subhash->{$sorted_key};
       }
    }
    

    【讨论】:

      【解决方案2】:

      哈希没有特定的顺序。您可能应该使用数组来维持秩序。

      【讨论】:

        【解决方案3】:

        您可以使用Tie::Hash::Sorted 完成此操作。但我宁愿考虑审查我的数据结构。如果您提供了更多关于您将在结构中存储何种数据的信息,而不仅仅是简单的数字,您的真实问题可能会得到更好的答案。

        #!/usr/bin/perl
        use strict;
        use warnings;
        
        use Tie::Hash::Sorted;
        
        my @aoh =(
             {
                3 => 15,
                4 => 8,
                5 => 9,
             },
             {
                3 => 11,
                4 => 25,
                5 => 6,
             },
            {
                3 => 5,
                4 => 18,
                5 => 5,
            },
            {
                0 => 16,
                1 => 11,
                2 => 7,
            },
            {
                0 => 21,
                1 => 13,
                2 => 31,
             },
            {
                0 => 11,
                1 => 14,
                2 => 31,
            },
        );
        
        my @sorted = map {
                tie my %h, 'Tie::Hash::Sorted',
                    Hash => { %$_ },
                    Sort_Routine => sub {
                            [ sort { $_[0]{$a} <=> $_[0]{$b} } keys %{$_[0]} ]
                        };
                \%h;
            } @aoh;
        
        # output data
        foreach my $elem (@sorted) {
            print "elem\n";
            while (my ($k, $v) = each %$elem) {
                print "    $k => $v\n";
            }
        }
        

        【讨论】:

          【解决方案4】:

          试试这个……

          foreach $hash ( @aoh)
              {
                      my %new  = reverse (%{$hash});
                      foreach ( sort {$a <=> $b } keys (%new ))
                      {
                              print " $new{$_} :$_ \n ";
                      }
                      print "-------------\n";
              }
          

          【讨论】:

          • %new 将破坏重复值。
          猜你喜欢
          • 2010-12-06
          • 2013-12-04
          • 2010-10-20
          • 2013-09-16
          • 1970-01-01
          • 2013-05-25
          • 1970-01-01
          • 2013-09-21
          • 2018-12-17
          相关资源
          最近更新 更多