Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Сортировка многомерного ряда


Автор: CPLUSPLUS 30.4.2005, 08:47
Здравствуйте!
Подскажите-ка быстренько, превеликие люди, как сортировать двумерный массив по первой измерений, чтобы привязанное к нему второе автоматом перемещалось вследзаним.
То есть:
Код

$array[0][0] = 'Петюнчик';
$array[0][1] = 'Самураев';
$array[1][0] = 'Василек';
$array[1][1] = 'Щасдайев';

И при печати по порядку было:
Василек Щасдайев
Петюнчик Самураев

Хотя у меня вообще-то числовые данные...
Премного благодарю за внимание.

Автор: korob2001 30.4.2005, 09:42
Код

#!/usr/bin/perl -w
use strict;
my @array = ();

$array[0][0] = 'Петюнчик';
$array[0][1] = 'Самураев';
$array[1][0] = 'Василек';
$array[1][1] = 'Щасдайев';
$array[2][0] = 'Василек';
$array[2][1] = 'Колобков';

foreach my $ref ( sort { $a->[0] cmp $b->[0]
                                 ||
                         $a->[1] cmp $b->[1] } @array ) {
     print $ref->[0] . " " . $ref->[1] . "\n";
}

Такая сортировака будет сортировать сначала по именам, если имена совпадают, то сортировка сортирует по фамилиям.

Если сортируешь числовые данные, то замени cmp на <=>

Возникнут вопросы по коду, пиши.

Удачи.

Автор: CPLUSPLUS 30.4.2005, 10:22
Thank You!!!
Чрезвычайно умный код, у Холзнера такого нет, сейчас буду разбираться...

Автор: Kiber_rat 1.5.2005, 02:48
Если сортировка второй размерности массива (фамилии в данном примере) не нужна
Цитата
сортировать двумерный массив по первой измерений, чтобы привязанное к нему второе автоматом перемещалось вследзаним
то достаточно будет и такого кода:
Код
#!/usr/bin/perl -w
use strict;
my @array = ();
$array[0][0] = 'Петюнчик';    
$array[0][1] = 'Самураев';    
$array[1][0] = 'Василек';    
$array[1][1] = 'Щасдайев';    
$array[2][0] = 'Василек';    
$array[2][1] = 'Колобков';
print "@$_\n" for sort {$a->[0] cmp $b->[0]} @array;

Автор: korob2001 1.5.2005, 09:56
Kiber_rat smile
Да я знаю, просто хотелось помочь человеку чуть больше, чем ему хотелось. Хотя может это и лишнее.

Автор: Kiber_rat 2.5.2005, 15:13
Да просто меня как обычно потянуло на рефакторинг smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)