|
|
|||||
как отсортировать? :(
.. есть, например, 3 массива - парвый - имя, второй - фамилия, 3 - телфон. Можно ли без дополнительных ивращений отсортировать по 2му или 3му массиву? или прийдется объединять в один, сортировать, а потом разделять снова?
__________________
Спирт - враг ваш! Гоните его! | Flash/Flex Blog |
|
|||||
Я бы ввел хэш из сортируемого массива, где ключи - элементы массива, а значения - их индексы... Потом сортируем массив и из хэша получаем отсортированные индексы, зная которые автоматом получаем отсортированные все остальные массивы... во навернул Лучше на примере:
@arr1 = ('a', 'b', 'c', 'c'); @arr2 = ('b', 'c', 'a', 'c'); @arr3 = ('c', 'a', 'b', 'c'); @sorted = &sortIndexes(\@arr3); foreach my $i(@sorted) { print $arr1[$i]." - ".$arr2[$i]." - ".$arr3[$i]."\n"; } sub sortIndexes { my $arr = shift; my %hash = (); foreach my $i(0..$#{$arr}) { @{$hash{$arr->[$i]}} = () if (!defined $hash{$arr->[$i]}); push @{$hash{$arr->[$i]}}, $i; } my @result = (); foreach my $sorted(sort @{$arr}) { push @result, @{$hash{$sorted}}; @{$hash{$sorted}} = (); } return @result; }
__________________
Two beer or not two beer?... |
|
|||||
10x
можно еще такую наглость как пару вопросов после всего написанного? :P $#{$arr} - получаем размер массива? а что за {} ? @{hash{$i} - @{ ? @{$arr} - ? ЗЫ: есть книжка маленькая по хэшам, но там почти ничего нет из тобой написанного.. это вообще урезанный перевод Perl Cookbook. Есть Perl Cookbook на русском в электронном виде? существует вообще? а то на инглише туго идёт а так реализация Твоя просто супер ) то что надо еще раз большое спасибо
__________________
Спирт - враг ваш! Гоните его! | Flash/Flex Blog |
|
|||||
1. Мы передаем в функцию не сам массив, а ссылку на него \@arr3 (со слэшем вначале) - это чтобы память не засорять и мало-ли потом нужно будет ещё какие-нить параметры добавить... Соответственно если внутри функции в переменной $arr ссылка на массив, а нам нужен он сам, то достаем его так: {$arr}. Элемент массива можно из ссылки выташить так: $arr->[$i].
2. Так как в сортируемом массиве могут оказаться одинаковые элементы, то значением в хэше для этого элемента должен быть не один индекс, а несколько, иначе мы потеряем все одинаковые элементы. Тут можно было либо просто в строке эти индексы перечислить, а потом разбить эту строку: foreach my $i(0..$#{$arr}) { $hash{$arr->[$i]} .= $i.","; } my @result = (); foreach my $sorted(sort @{$arr}) { push @result, split (",", $hash{$sorted}); $hash{$sorted} = ""; } Да, только сейчас заметил, что при генерации результата лучше сделать так: Тогда не будем повторно пробегать по одинаковым элементам исходного массива
__________________
Two beer or not two beer?... Последний раз редактировалось SPV; 30.01.2004 в 14:15. |
|
|||||
я перед тем как написать предыд. пост разбирался что ты написал
где знал, где нет - методом тыка и исключений понял что передаёш ссылку на массив.. предположил что {$arr} это получение массива по ссылке, попробовал его print'ом взять но он не дался Как функционирует и что как делается понял.. сидел разбирал каждую строку.. понял! Проблема была в самом синтаксисе.. я его не очень знаю.. а тем более все его варианты Единственной загадкой для меня осталась конструкция @{$hash{'a'}} это что за @? просто ты написал @{$hash{$arr->[$i]}} = () if (!defined $hash{$arr->[$i]}); но левая и правая конструкции разные.. в чём? я б написал так (ессно после твоей подсказки ) #!usr/bin/perl @arr1 = ('aa', 'b', 'c', 'c'); @arr2 = ('bb', 'c', 'a', 'c'); @arr3 = ('cc', 'a', 'b', 'c'); @sorted = &sortIndexes(\@arr3); foreach my $i(@sorted) { print $arr1[$i]." - ".$arr2[$i]." - ".$arr3[$i]."\n"; } sub sortIndexes { my $arr = shift; my %hash = (); foreach my $i(0..$#{$arr}) { $hash{$arr->[$i]}=$i; } my @result = (); foreach my $sorted(sort keys %hash) { push @result, $hash{$sorted}; delete $hash{$sorted}; } return @result; } ЗЫ: но идея класс почему мне такая не пришла? :P ЗЗЫ: Может подскажешь хоть алгоритм как проще реализовать слегка измененную эту задачу.. слегка это: теперь массивы содержат не списки имен/фамилий/.. , а записи, типа @arr1=["Иван","Иванович","Иванов"];@arr2=[]..
__________________
Спирт - враг ваш! Гоните его! | Flash/Flex Blog |
|
|||||
"simple"
|
Что-то я не понял что нужно в изменённой задаче сортировать...
Ещё не понятно, что ты хотел сказать вот этой срокой: @arr1=["Иван","Иванович","Иванов"]; что первый элемент массива ссылка на массив? или же что это массив (тогда нужны круглые вместо квадратных скобок)? |
|
|||||
да, скоббки круглые..
в 1 случае - массив имен, массив фамилии, а во 2 - массив это запись имя-фамилия-..
__________________
Спирт - враг ваш! Гоните его! | Flash/Flex Blog |
|
|||||
"simple"
|
2WD`
Цитата:
|
Часовой пояс GMT +4, время: 22:40. |
|
« Предыдущая тема | Следующая тема » |
|
|