perl6.suОсвоим perl6 к 2015 году!

nota IX. Сортировка массивов


       Часто приходится массивы сортировать. Ну вот попробуем как это в perl 6.
    
#!/usr/bin/perl6
my @list=<perl6.su rakudo.org perl.org perl6.ru>;
"{@list}".say;
@list=@list.sort;
"{@list}".say;
perl6.su rakudo.org perl.org perl6.ru
perl.org perl6.ru perl6.su rakudo.org

       Что и ожидалось. А если попробовать так?
    
#!/usr/bin/perl6
my @list=<perl6.su rakudo.org perl.org perl6.ru>;
"{@list}".say;
@list=@list.sort.reverse;
"{@list}".say;
perl6.su rakudo.org perl.org perl6.ru
rakudo.org perl6.su perl6.ru perl.org

       Здесь мы сначала отсортировали, а потом перевернули массив. Bene.
       Далее возьмём массивчик побольше, попробуем его посортировать по критериям. Допустим у нас есть сельский роддом, в котором рождаются мальчики и девочки. Мы ведём статистику по месяцам.
    
#!/usr/bin/perl6
my %vir=<jan 10 feb 9 mar 11 apr 10 maj 12 jun 13 jul 15 aug 11 sep 10 oct 7 nov 9 dec 11>;
my %fem=<jan 10 feb 8 mar 10 apr 11 maj 14 jun 10 jul 13 aug 11 sep 9 oct 8 nov 8 dec 8>;
# нам надо отсортировать месяцы по "полезности"
my @lunae=%vir.keys.sort({ %vir{$_}+%fem{$_} }).reverse;
for @lunae {
	say $_,' ',%vir{$_}+%fem{$_}
	}
jul 28
maj 26
jun 23
aug 22
apr 21
mar 21
jan 20
dec 19
sep 19
nov 17
feb 17
oct 15

       Вот. Видно, что июль - самый полезный месяц. Но надо же решить окончательно, что полезнее, март или апрель. Тогда наш вымышленный главврач решил, что надо ввести дополнительный критерий, сравнивать по девочкам. Если девочек родилось больше, то это лучше. Это не шовинизм, а простой расчёт. Потом эти девочки подрастут и тоже станут матерями. Ставим ещё один sort:
    
#!/usr/bin/perl6
my %vir=<jan 10 feb 9 mar 11 apr 10 maj 12 jun 13 jul 15 aug 11 sep 10 oct 7 nov 9 dec 11>;
my %fem=<jan 10 feb 8 mar 10 apr 11 maj 14 jun 10 jul 13 aug 11 sep 9 oct 8 nov 8 dec 8>;
# нам надо отсортировать месяцы по "полезности"
my @lunae=%vir.keys.sort({ %fem{$_} }).sort({ %vir{$_}+%fem{$_} }).reverse;
for @lunae {
	say $_,' ',%vir{$_}+%fem{$_}
	}
jul 28
maj 26
jun 23
aug 22
apr 21
mar 21
jan 20
sep 19
dec 19
nov 17
feb 17
oct 15

       Просто praeclare! Здесь кроется очень приятная особенность sort: он бережно относится с предыдущим порядком. При прочих равных условиях он его сохраняет. Кстати, в нашем примере ноябрь лучше февраля потому, что он в списке позже, а при reverse список развернулся.
       N. B. Чем важнее критерий сравнения, тем ближе к концу цепочки сортов он должен стоять.
# mutatio postrema: 10 Aug 2010

   сортировка массива, sort, reverse      charta situs       nota VIII <<     >> nota X   

    RSS     stdin@perl6.su    © Alexius Karmanov, 2010-2011