Сортировать хэш по значению и ключу (в таком порядке) - PullRequest
9 голосов
/ 17 октября 2011

Я ищу хороший способ сортировки хэша в Perl по значению сначала, а затем по ключу.

Пример:

 my %userids = (
  williams => "Marketing",
  smith    => "Research",
  johnson  => "Research",
  jones    => "Marketing",
  brown    => "Marketing",
  davis    => "Research"
);

Выход:

Marketing: brown
Marketing: jones
Marketing: williams
Research: davis
Research: johnson
Research: smith

Обратите внимание, что значение было первым уровнем сортировки. Второй уровень сортировки - ключ . Любая идея, как сделать это элегантным и высокопроизводительным способом? Спасибо!

Ответы [ 2 ]

27 голосов
/ 17 октября 2011

Полезная ссылка: http://www.misc -perl-info.com / perl-sort.html # shv

#!/usr/bin/perl

my %userids = (
    williams => "Marketing",
    smith    => "Research",
    johnson  => "Research",
    jones    => "Marketing",
    brown    => "Marketing",
    davis    => "Research"
);

foreach (sort { ($userids{$a} cmp $userids{$b}) || ($a cmp $b) } keys %userids) 
{
    print "$_: $userids{$_}\n";
}
7 голосов
/ 17 октября 2011

Я хотел бы добавить еще одну вещь, использовать \L sequence в сортировке.

С Perlfaq4 : Как отсортировать хэш (необязательно по значению вместо ключа)?

Чтобы сделать наш порядок отчетов нечувствительным к регистру, мы используем \L sequence в строке в двойных кавычках, чтобы все было в нижнем регистре. Затем блок sort() сравнивает значения в нижнем регистре, чтобы определить, в каком порядке ставить ключи.

foreach (sort { $userids{$a} cmp $userids{$b} or "\L$a" cmp "\L$b" )  {
    print "$_: $userids{$_}\n"; 
} 

Выход:

brown: Marketing
jones: Marketing
williams: Marketing
davis: Research
Johnson: Research # here 'J'ohnson, J is in uppercase(taking assumption), come as fifth record
smith: Research

2

foreach (sort { $userids{$a} cmp $userids{$b} or $a cmp $b )  {
    print "$_: $userids{$_}\n"; 
}

Выход:

brown: Marketing
jones: Marketing
williams: Marketing
Johnson: Research # here it shifted to fourth record
davis: Research
smith: Research
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...