Сортировка хэша массивов с помощью Perl - PullRequest
0 голосов
/ 26 августа 2018
my %Hash = ( 

   1111 => [5,6] ,
   5555 => [3,4],   
   2222 => [3],
   4444 => [3,1]

)

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

   <p>  Output:  
    1111 => 6
            5,

    5555 => 4
            3 ,

    4444 => 3
            1 ,

    2222 => 3
</p>

1 Ответ

0 голосов
/ 26 августа 2018

Я не знаю, что вы имеете в виду по убыванию.Можете ли вы показать пример?Я пойду к выводу, который вы показываете.

Я предполагал, что вы не хотите изменять исходные данные (что может быть не так), поэтому я использовал сортировку карты, чтобы создать промежуточную сортировку.Я прохожу этот промежуточный результат по порядку и делаю ненужные биты, чтобы получить то, что вы хотите.Большая часть уродства заключается в том, что вы получили нужный вам формат.

Разблокировка постфикса полезна здесь:

use v5.26;
use utf8;
use strict;
use warnings;

my %Hash = (
   1111 => [5,6],
   5555 => [3,4],
   2222 => [3],
   4444 => [3,1]
);


foreach my $tuple (
    sort {
        $b->[1][0] <=> $a->[1][0]
        }
    map {
        [ $_, [ sort { $b <=> $a } $Hash{$_}->@* ] ];
        }
    keys %Hash
    ) {
    print my $string = "$tuple->[0] => ";
    my $indent = length $string;
    foreach my $i ( 0 .. $tuple->[1]->$#* ) {
        print ' ' x $indent if $i;
        print $tuple->[1][$i];
        print ',' if $i == $tuple->[1]->$#*;
        print "\n";
        }
    }

Это дает:

1111 => 6
        5,
5555 => 4
        3,
4444 => 3
        1,
2222 => 3,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...