![]() |
|
||||||||||
|
|||||
|
.. есть, например, 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, время: 15:06. |
|
|
« Предыдущая тема | Следующая тема » |
|
|