簡體   English   中英

在第一元素方式Perl中對哈希值進行排序

[英]Sort Hash Value In A First Element Manner Perl

我有一個哈希,我想以首先找到的元素的方式對其值進行排序。 在下面的腳本中,我按字母順序對值進行了排序,但我真正想要的是根據先出現的值對它進行排序,例如,鍵0為ACBAD的值,第一個為A,因此對所有值進行排序首先,然后是C,然后是B,最后是D,我知道如何按字母順序對其進行排序,但我不知道如何處理所需的訂單。

#!/usr/bin/perl
use warnings;
use strict;
use List::MoreUtils;
use Tie::IxHash;    

my %KEY_VALUE;
#tie %KEY_VALUE,'Tie::IxHash';


my %KEY_VALUE= (
    0 => [ 'A', 'C', 'B', 'A' ,'D'],
    5 => [ 'D', 'F', 'E', 'F', 'F','E'],
    2 => [ 'Z', 'X', 'A', 'Y', 'X', 'Y', 'A' ],
    4 => [ 'E', 'R', 'M' ,'M','E'],
    3 => [ 'A', 'B', 'B', 'A' ],
    1 => [ 'C', 'C', 'F', 'E', 'C', 'E'],
    );

    #Code from Schwern user:14660
    # Iterate through the keys in numeric order.
    for my $key (sort {$a <=> $b } keys %KEY_VALUE)
    {
    # Get the value
    my $val = $KEY_VALUE{$key};

    # Sort it in place  #How to sort it in First Found Element instead of alphabetically increasing?

    @$val = sort { $a cmp $b } @$val;

    # Display it
    print "$key -> @$val\n";
    }

所需的輸出是這樣的,我想打印出排序的鍵和值。

    0 -> AACBD
    1 -> CCCFEE
    2 -> ZXXAAYY
    3 -> AABB
    4 -> EERMM
    5 -> DFFFEE

如果您將其視為排序問題,則可以在值及其所需順序之間建立映射:

my @unsorted = qw( Z X X A Y X Y A );

my %order; @order{ reverse @unsorted } = reverse 0..$#unsorted;   # Z=>0, X=>1, A=>3, Y=>4
my @sorted = sort { $order{$a} <=> $order{$b} } @unsorted;        # ZXXXAAYY

但這實際上不是排序問題。 排序為O(N log N),但這可以在O(N)中完成。

my @unsorted = qw( Z X X A Y X Y A );

my %counts;
my @uniques = grep { !$counts{$_}++ } @unsorted;
my @sorted = map { ($_) x $counts{$_} } @uniques;                 # ZXXXAAYY

您得到了我認為想要的東西,非常簡單。 您只需按照排序的鍵順序遍歷哈希,然后取消引用數組並對其進行排序。

#!/usr/bin/perl
use warnings;
use strict;

my %KEY_VALUE= (
    0 => [ 'A', 'C', 'B', 'A' ,'D'],
    5 => [ 'D', 'F', 'E', 'F', 'F','E'],
    2 => [ 'Z', 'X', 'A', 'Y', 'X', 'Y', 'A' ],
    4 => [ 'E', 'R', 'M' ,'M','E'],
    3 => [ 'A', 'B', 'B', 'A' ],
    1 => [ 'C', 'C', 'F', 'E', 'C', 'E'],
);

for my $key (sort { $a <=> $b } keys %KEY_VALUE) {
  print $key, " -> ", sort(@{ $KEY_VALUE{$key} }), "\n";
}

但這並不能提供您顯示的結果。 請解釋每個數組應該如何排序。 我以為您希望它們按字母順序排序,但是在您的示例中情況並非如此。

我得到這個:

0 -> AABCD
1 -> CCCEEF
2 -> AAXXYYZ
3 -> AABB
4 -> EEMMR
5 -> DEEFFF

但您要求:

0 -> AACBD
1 -> CCCFEE
2 -> ZXXAAYY
3 -> AABB
4 -> EERMM
5 -> DFFFEE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM