Как мне сохранить отсортированный хэш в Perl? - PullRequest
1 голос
/ 25 марта 2010
 @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,
},
);

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

Ответы [ 4 ]

1 голос
/ 25 марта 2010

У хэшей 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};
   }
}
1 голос
/ 25 марта 2010

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

0 голосов
/ 25 марта 2010

Вы можете сделать это с 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";
    }
}
0 голосов
/ 25 марта 2010

Попробуйте это ....

foreach $hash ( @aoh)
    {
            my %new  = reverse (%{$hash});
            foreach ( sort {$a <=> $b } keys (%new ))
            {
                    print " $new{$_} :$_ \n ";
            }
            print "-------------\n";
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...