URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7427
[ Назад ]

Исходное сообщение
"Сортировка хэша по значениям"

Отправлено sn , 19-Июн-08 10:52 
Есть хэш хэшей вида:

%list = (
  Ivanov => {
    fio => "Иванов А.А.",
    address => "192.168.1.1",
    ostatok => -311.22,
  },
  Petrov => {
    fio => "Петров Б.Б.",
    address => "192.168.1.2",
    ostatok => 1100.54,
  },
...
);

Вывод производится так:

    foreach $k (sort keys %list) {

print $list{$k}{fio}.":".$list{$k}{address}.":".$list{$k}{ostatok}."\n";
    }

Посоветуйте, как описать sort{ ля{$b} <=> ля{$a} }, чтобы организовать вывод списка, отсортированного по размеру остатка.


Содержание

Сообщения в этом обсуждении
"Сортировка хэша по значениям"
Отправлено Mil , 19-Июн-08 12:24 
Короткий путь -- заменть
sort keys %list
на
sort {$list{$a}{'ostatok'} <=> $list{$b}{'ostatok'}} keys %list

но на больших массивах это будет протормаживать. Правильнее в таких случаях использовать преобразование рендола-шварца. В данном случае оно вот так выглядет:

map {$_->[1]} sort {$a->[0] <=> $b->[0]} map {[$list{$_}{'ostatok'}, $_]} keys(%list)

оно чуть медленней на маленьких списках, но на больших на много быстрей


"Сортировка хэша по значениям"
Отправлено sn , 19-Июн-08 15:02 
Благодарю

"Сортировка хэша по значениям"
Отправлено XAnder , 19-Июн-08 12:33 
>Посоветуйте, как описать sort{ ля{$b} <=> ля{$a} }, чтобы организовать вывод списка, отсортированного по размеру остатка.

Самый очевидный вариант:

sort {$list{$a}{ostatok} <=> $list{$b}{ostatok}}