PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 138


Решение

Воспользуйтесь нестандартной функцией сравнения в sort: ©ordered = sort  { compareQ  } ©unordered, Для ускорения работы значение поля можно вычислить заранее:

@рrecomputed = map {  [computeO, $_]  } ©unordered,

@ordered_precomputed = sort  {  $a->[0] <=> $b->[0]  } ©precomputed,

©ordered = map  {  $_->[1]  } @ordered_precomputed,

Наконец, эти три шага можно объединить:

©ordered = map  {  $_->[1]  }

sort  {  $a->[0] <=> $b->[0]  } map {  [computeO, $_]  } ©unordered,


140   Глава 4 • Массивы

Комментарий

О том, как пользоваться функциями сравнения, рассказано в рецепте 4.14. Поми­мо использования встроенных операторов вроде <=>, можно конструировать бо­лее сложные условия:

©ordered = sort  { $a->name cmp $b->name } ©employees,

Функция sort часто используется подобным образом в циклах foreach:

foreach $employee (sort {$a->name cmp $b->name } (^employees)  {

print $employee->name,      earns \$ ,   $employee->salary,    \n , }

Если вы собираетесь много работать с элементами, расположенными в опреде­ленном порядке, эффективнее будет сразу отсортировать их и работать с отсор­тированным списком:

@sorted_employees = sort { $a->name cmp $b->name } ©employees, foreach $employee (©sorted_employees) {

print $employee->name, earns \$ , $employee->salary, \n , }

Я Загрузить %bonus foreach $employee (@sorted_employees) {

if ($bonus{ $employee->ssn } ) {

print $employee->name, got a bonus1\n ,

В функцию можно включить несколько условий и разделить их оператора­ми ||. Оператор || возвращает первое истинное (ненулевое) значение Следователь­но, сортировку можно выполнять по одному критерию, а при равенстве элемен­тов (когда возвращаемое значение равно 0) сортировать по другому критерию. Получается «сортировка внутри сортировки»:

©sorted = sort  {$a->name cmp $b->name

II $b->age    <=> $a->age) ©employees,

Первый критерий сравнивает имена двух работников. Если они не совпада­ют, 11 прекращает вычисления и возвращает результат cmp (сортировка в порядке возрастания имен). Но если имена совпадают, 11 продолжает проверку и возвра­щает результат <=> (сортировка в порядке убывания возраста). Полученный спи­сок будет отсортирован по именам и по возрасту в группах с одинаковыми именами.




- Начало -  - Назад -  - Вперед -