Forum Webscript.Ru

Программирование => Perl => Тема начата: tenzors от 02 Апреля 2002, 22:33:19

Название: Сортировка массива
Отправлено: tenzors от 02 Апреля 2002, 22:33:19
Есть массив с полями Namе,  Price, Old
    $results[1]=(А/касс.LG;  0,25; У.е.)
    $results[2]=(А/касс.GE;  0,25; У.е.)
    $results[3]=(А/касс.SAM; 0,25; У.е.)
Как выполнить сортировку по полю Name, но и
учитывать соседние поля, если значения в поле
Name одинковые. Или сделать сортировку по другому
полю.
Название: ээ
Отправлено: Green Kakadu от 04 Апреля 2002, 12:35:04
проще написать отдельную подпрограммку, которая бы разбивала строку, сравнивала нужные поля, и возвращала бы -1, 0 или 1 и это присобачить к ф-ции sort
Название: Пример
Отправлено: Green Kakadu от 04 Апреля 2002, 12:56:25
Во, пример такой сортировки.
Сортируется по именам (2-е поле), если имена совпадают, то сортируется по ID (первое поле)
Имена я использовал английские сами знаете почему - если нужны русские, то читайте тут FAQ и включайте locale


#!/usr/bin/perl -w

my @array =( \'1;Pete;Red\',
             \'7;Mike;Green\',
             \'9;Barry;Red\',
             \'3;Ann;Blue\',
             \'2;Merry;Green\',
             \'11;Pete;Pink\');
             
map {print "$_\\n"} sort by_field(@array);
             
sub by_field {
   my @a=split(/;/, $a);
   my @b=split(/;/,$b);
   ($a[1] cmp $b[1])||($a[0] <=> $b[0]);
}   


Результат:
3;Ann;Blue
9;Barry;Red
2;Merry;Green
7;Mike;Green
1;Pete;Red
11;Pete;Pink
Название: Сортировка массива
Отправлено: tenzors от 06 Апреля 2002, 00:23:11
Спасибо
Название: Сортировка массива
Отправлено: Ленивый гость от 28 Сентября 2002, 00:31:46
Подскажите еще чего-нибудь?
Можно еще примерчик
Название: Сортировка массива
Отправлено: NeoNox от 28 Сентября 2002, 14:37:14
Цитировать
Подскажите еще чего-нибудь?

А что не понятно???
Название: Сортировка массива
Отправлено: Ленивый гость от 28 Сентября 2002, 16:16:52
my @array =(
\'12;Pete;X\',
\'1;Pete;Red\',
\'7;Mike;Green\',
\'9;Barry;Red\',
\'3;Ann;Blue\',
\'2;Merry;Green\',
\'11;Pete;Pink\');


@array=sort{($a=~m/;(.+);/)[0] cmp ($b=~m/;(.+);/)[0]
or ($a=~m/^(\\d+)/)[0] <=> ($b=~m/^(\\d+)/)[0] }@array;

print join "\\n",@array;
Название: Сортировка массива
Отправлено: Ленивый гость от 28 Сентября 2002, 16:52:22
my @array =(
\'12;Pete;X\',
\'1;Pete;Red\',
\'7;Mike;Green\',
\'9;Barry;Red\',
\'3;Ann;Blue\',
\'2;Merry;Green\',
\'11;Pete;Pink\');


@array=sort{(split /;/,$a)[1] cmp (split /;/,$b)[1] or
(split /;/,$a)[0] <=> (split /;/,$b)[0]}@array;

print join "\\n",@array;
Название: Сортировка массива
Отправлено: Serchey от 28 Сентября 2002, 17:20:33
Цитировать
or
- не привильнее было-бы ||?
Название: Сортировка массива
Отправлено: Ленивый гость от 28 Сентября 2002, 18:37:31
Цитировать
не привильнее было-бы ||?


нет
Название: Сортировка массива
Отправлено: Serchey от 28 Сентября 2002, 21:34:07
Правильно - без разницы!