Как можно выполнить сортировку по ключам или значениям в хеше в Perl?

Пользователь

от christine , в категории: Другие , 2 года назад

Как можно выполнить сортировку по ключам или значениям в хеше в Perl?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от steve , 2 года назад

@christine 

В Perl существует несколько способов выполнения сортировки хеша по ключам или значениям:

  1. Сортировка по ключам:
1
2
3
4
5
6
my %hash = ('b' => 2, 'a' => 1, 'c' => 3);

foreach my $key (sort keys %hash) {
    print "$key: $hash{$key}
";
}


В этом примере мы используем функцию sort для сортировки ключей хеша %hash. Результат будет отсортирован по алфавиту по умолчанию, т.е. будет выведено:

1
2
3
a: 1
b: 2
c: 3


  1. Сортировка по значениям:
1
2
3
4
5
6
my %hash = ('b' => 2, 'a' => 1, 'c' => 3);

foreach my $key (sort { $hash{$a} <=> $hash{$b} } keys %hash) {
    print "$key: $hash{$key}
";
}


В этом примере мы используем функцию sort с пользовательской функцией сравнения, которая сравнивает значения хеша %hash. Результат будет отсортирован по возрастанию значений и будет выведено:

1
2
3
a: 1
b: 2
c: 3


Мы используем оператор <=> для числовой сортировки значений. Если значения являются строками, можно использовать оператор cmp.

  1. Сортировка по значениям без потери ключей:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
my %hash = ('b' => 2, 'a' => 1, 'c' => 3);

my @sorted_keys = sort { $hash{$a} <=> $hash{$b} } keys %hash;
my %sorted_hash;
foreach my $key (@sorted_keys) {
    $sorted_hash{$key} = $hash{$key};
}

foreach my $key (keys %sorted_hash) {
    print "$key: $sorted_hash{$key}
";
}


В этом примере мы создаем отдельный массив с отсортированными ключами и затем используем этот массив для создания нового хеша %sorted_hash. Этот метод сохраняет исходный хеш %hash, но возвращает отсортированный хеш %sorted_hash. Результат будет выведен в том же порядке, что и в предыдущем примере:

1
2
3
a: 1
b: 2
c: 3


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

Пользователь

от jedidiah.brown , 6 месяцев назад

@christine 

Дополнительно можно использовать модуль List::Util для выполнения сортировки хеша по значениям:

1
2
3
4
5
6
7
8
use List::Util qw( pairvalues );

my %hash = ('b' => 2, 'a' => 1, 'c' => 3);

foreach my $key (pairvalues { $a cmp $b } %hash) {
    print "$key
";
}


Этот подход аналогичен сортировке по значениям с использованием функции sort, только используется функция pairvalues из модуля List::Util. В этом случае результат также будет отсортирован по алфавиту и будет выводиться только значение из хеша.