Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Архив Flasher.ru > Программирование > Perl

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 29.01.2004, 00:24
WD` вне форума Посмотреть профиль Отправить личное сообщение для WD` Найти все сообщения от WD`
  № 1  
WD`
 
Аватар для WD`

Регистрация: Sep 2001
Адрес: Кишинёв
Сообщений: 1,516
Отправить сообщение для WD` с помощью ICQ
Arrow как отсортировать? :(

.. есть, например, 3 массива - парвый - имя, второй - фамилия, 3 - телфон. Можно ли без дополнительных ивращений отсортировать по 2му или 3му массиву? или прийдется объединять в один, сортировать, а потом разделять снова?
__________________
Спирт - враг ваш! Гоните его! | Flash/Flex Blog

Старый 29.01.2004, 20:00
SPV вне форума Посмотреть профиль Отправить личное сообщение для SPV Найти все сообщения от SPV
  № 2  
SPV
 
Аватар для SPV

Регистрация: Jan 2000
Адрес: St-Petersburg
Сообщений: 1,229
Отправить сообщение для SPV с помощью ICQ
Я бы ввел хэш из сортируемого массива, где ключи - элементы массива, а значения - их индексы... Потом сортируем массив и из хэша получаем отсортированные индексы, зная которые автоматом получаем отсортированные все остальные массивы... во навернул Лучше на примере:
Код:
@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?...

Старый 30.01.2004, 13:33
WD` вне форума Посмотреть профиль Отправить личное сообщение для WD` Найти все сообщения от WD`
  № 3  
WD`
 
Аватар для WD`

Регистрация: Sep 2001
Адрес: Кишинёв
Сообщений: 1,516
Отправить сообщение для WD` с помощью ICQ
10x
можно еще такую наглость как пару вопросов после всего написанного? :P
$#{$arr} - получаем размер массива? а что за {} ?
@{hash{$i} - @{ ?
@{$arr} - ?

ЗЫ: есть книжка маленькая по хэшам, но там почти ничего нет из тобой написанного.. это вообще урезанный перевод Perl Cookbook.
Есть Perl Cookbook на русском в электронном виде? существует вообще? а то на инглише туго идёт

а так реализация Твоя просто супер ) то что надо
еще раз большое спасибо
__________________
Спирт - враг ваш! Гоните его! | Flash/Flex Blog

Старый 30.01.2004, 14:05
SPV вне форума Посмотреть профиль Отправить личное сообщение для SPV Найти все сообщения от SPV
  № 4  
SPV
 
Аватар для SPV

Регистрация: Jan 2000
Адрес: St-Petersburg
Сообщений: 1,229
Отправить сообщение для SPV с помощью ICQ
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} = "";
  }
Либо как сделал я - Элементами кэша являются массивы, а не строки, что позволяет не делать потом split. Т.е. мы сначала объявляем элемент хэша как массив: @{$hash{$arr->[$i]}} = () а потом добавляем в этот массив индексы.

Да, только сейчас заметил, что при генерации результата лучше сделать так:
Код:
  my @result = ();
  foreach my $sorted(sort keys %hash) {
    push @result, @{$hash{$sorted}};
  }
Тогда не будем повторно пробегать по одинаковым элементам исходного массива
__________________
Two beer or not two beer?...


Последний раз редактировалось SPV; 30.01.2004 в 14:15.
Старый 31.01.2004, 00:18
WD` вне форума Посмотреть профиль Отправить личное сообщение для WD` Найти все сообщения от WD`
  № 5  
WD`
 
Аватар для WD`

Регистрация: Sep 2001
Адрес: Кишинёв
Сообщений: 1,516
Отправить сообщение для WD` с помощью ICQ
я перед тем как написать предыд. пост разбирался что ты написал
где знал, где нет - методом тыка и исключений
понял что передаёш ссылку на массив.. предположил что {$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;
}
можно еще 2 слова о shift'е? просто я знал только @_[] а shift..
ЗЫ: но идея класс почему мне такая не пришла? :P
ЗЗЫ: Может подскажешь хоть алгоритм как проще реализовать слегка измененную эту задачу.. слегка это: теперь массивы содержат не списки имен/фамилий/.. , а записи, типа @arr1=["Иван","Иванович","Иванов"];@arr2=[]..
__________________
Спирт - враг ваш! Гоните его! | Flash/Flex Blog

Старый 10.02.2004, 00:52
metton вне форума Посмотреть профиль Отправить личное сообщение для metton Посетить домашнюю страницу metton Найти все сообщения от metton
  № 6  
metton
"simple"
 
Аватар для metton

Регистрация: Feb 2002
Адрес: Россия, Москва
Сообщений: 1,155
Отправить сообщение для metton с помощью ICQ
Что-то я не понял что нужно в изменённой задаче сортировать...
Ещё не понятно, что ты хотел сказать вот этой срокой:
@arr1=["Иван","Иванович","Иванов"];
что первый элемент массива ссылка на массив?
или же что это массив (тогда нужны круглые вместо квадратных скобок)?

Старый 14.02.2004, 19:21
WD` вне форума Посмотреть профиль Отправить личное сообщение для WD` Найти все сообщения от WD`
  № 7  
WD`
 
Аватар для WD`

Регистрация: Sep 2001
Адрес: Кишинёв
Сообщений: 1,516
Отправить сообщение для WD` с помощью ICQ
да, скоббки круглые..
в 1 случае - массив имен, массив фамилии,
а во 2 - массив это запись имя-фамилия-..
__________________
Спирт - враг ваш! Гоните его! | Flash/Flex Blog

Старый 14.02.2004, 19:36
metton вне форума Посмотреть профиль Отправить личное сообщение для metton Посетить домашнюю страницу metton Найти все сообщения от metton
  № 8  
metton
"simple"
 
Аватар для metton

Регистрация: Feb 2002
Адрес: Россия, Москва
Сообщений: 1,155
Отправить сообщение для metton с помощью ICQ
2WD`
Цитата:
а во 2 - массив это запись имя-фамилия-..
И что нам, пгастите тогда нужно сортировать?

Создать новую тему   Часовой пояс GMT +4, время: 21:12.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 21:12.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.