Сортировать значение хэша в манере первого элемента Perl - PullRequest
0 голосов
/ 12 октября 2018

У меня есть хеш, который я хочу отсортировать по значениям первым найденным элементом.Из приведенного ниже сценария я отсортировал значения в алфавитном порядке, но я действительно хочу отсортировать его в соответствии с первыми значениями, например, ключом 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

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Вы получаете то, что я думаю, что вы хотите, это довольно просто.Вы просто просматриваете хеш в порядке сортировки ключей, а затем разыменовываете массив и сортируете его.

#!/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
0 голосов
/ 12 октября 2018

Если вы рассматриваете это как проблему сортировки, вы можете построить отображение между значениями и их желаемым порядком:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...