Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Комплексная сортировка, объединить сравнение по <=> и cmp ? 
:(
    Опции темы
Suppir
Дата 17.7.2010, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Добрый день!

Есть хеш с ключами вида:

Закон Краснодарского края от 01.05.2010 N 1370-кз
Закон Краснодарского края от 02.05.2010 N 1371-кз
Постановление губернатора Краснодарского края от 01.05.2010 N 456
Постановление губернатора Краснодарского края от 01.05.2010 N 457
Приказ департамента здравоохранения от 07.03.2009 N 12
Приказ департамента здравоохранения от 07.01.2009 N 2


Мне нужно перебрать этот хеш с сортировкой:

foreach $x(sort sSort (keys %hash)){
      print "$x\n";
}


sub sSort{
    #  здесь нужна функция сортировки

}


я могу отсортировать даты вида 01.01.2010 и 02.03.2009:

sub sorDate{
    $hash{$a}{date} =~ /(\d+)\.(\d+)\.(\d+)/;
    $c = $3.$2.$1;
    $hash{$b}{date} =~ /(\d+)\.(\d+)\.(\d+)/;
    $d = $3.$2.$1;
    $d <=> $c;
}


Однако мне нужно сделать сортировку строк вида "Закон Краснодарского края от 01.05.2010 N 1370-кз" следующим образом:
1) в первую очередь учитывается текст до даты (сортировка по алфавиту - $a cmp $b)
2) потом сортировка по дате (однако по номеру нужно сравнивать с помощью $a <=> $b)

Можно ли объединить два вида сортировки: cmp и <=> в одной функции сортировки? Спасибо.


PM MAIL   Вверх
skyboy
Дата 17.7.2010, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



так же, как вычленяешь даты, вычлени и остальные параметры сравнения. и воспользуйся тем, что <=> возвращает 0, если элементы равны. и используй оператор "или": ||
 как-то так:
Код

$name1 cmp $name2 
||
$date1 <=> $date2

PM MAIL   Вверх
Suppir
Дата 17.7.2010, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Спасибо, попробую!
PM MAIL   Вверх
Suppir
Дата 18.7.2010, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Работает!

только мне кажется, что работает чуть помедленней, чем если сделать сортировку два раза: первый раз по алфавиту, второй раз по дате.
Потому что если делать сортировку два раза, то используются более короткие регулярные выражения. 
PM MAIL   Вверх
skyboy
Дата 18.7.2010, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Цитата(Suppir @  18.7.2010,  09:20 Найти цитируемый пост)
Работает!

я рад. на Perl никогда не писал  smile 
Цитата(Suppir @  18.7.2010,  09:20 Найти цитируемый пост)
первый раз по алфавиту, второй раз по дате.

привет. если второй раз делать сортировку по дате, то функция пересортирует весь массив по дате, а не только те элементы, где имя совпадает. это ж совсем другое. длина регулярки не имеет значения. а имеет значение сложность.
кстати, ты одной регуляркой разбиваешь на части, или для вытягивания каждой части ты натравливаешь разные регулярки в отдельности?
в Perl должно быть, но я без опыта это уже не нашел, такая вещь, как компиляция регулярного выражения. Что позволяет сделать разбор регулярки только раз. Если тебя так напрягает скорость - выясни этот момент.
Цитата(Suppir @  18.7.2010,  09:20 Найти цитируемый пост)
только мне кажется

лучше бы проверить чем-то. не поверю, что под Perl нет инструментов профилирования, что приходится рассчитывать только на "кажется"  smile 
PM MAIL   Вверх
Suppir
Дата 18.7.2010, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Вот так стала выглядеть функция сортировки:


sub smartSort{

    $hash{$a}{type} =~ /(\S+)\s(.+)? от (\d+)\.(\d+)\.(\d+)/;
    $stype1= $1.$2.$1; $sdate1 = $5.$4.$3;
    $hash{$b}{type} =~ /(\S+)\s(.+)? от (\d+)\.(\d+)\.(\d+)/;
    $stype2 = $1.$2.$1;  $sdate2 = $5.$4.$3;

    $stype1 cmp $stype2 
    ||
    $sdate2 <=> $sdate1
}



Это сообщение отредактировал(а) Suppir - 18.7.2010, 11:29
PM MAIL   Вверх
skyboy
Дата 18.7.2010, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



нормально работает?
PM MAIL   Вверх
Suppir
Дата 18.7.2010, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Да вроде работает smile
PM MAIL   Вверх
ming
Дата 18.7.2010, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 30.1.2009
Где: Новосибирск

Репутация: 2
Всего: 3



попробуйте к регуляркам добавить модификатор "о" для их прекомпиляции. Вдруг немного ускорит?
$hash{$a}{type} =~ /(\S+)\s(.+)? от (\d+)\.(\d+)\.(\d+)/o;
$hash{$b}{type} =~ /(\S+)\s(.+)? от (\d+)\.(\d+)\.(\d+)/o;
PM MAIL ICQ Jabber   Вверх
Suppir
Дата 18.7.2010, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



ming, замерил бенчмарком - скорость ровно такая же. Но, в принципе, на сортировку уходит не так много времени - около минуты.
PM MAIL   Вверх
KSURi
Дата 19.7.2010, 19:00 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Регулярные выражения, которые не содержат внутри себя переменных компилируются автоматически.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0513 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.