Автор Тема: Сложная сортировка массива (по дате и номеру)  (Прочитано 5290 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Suppir [?]

  • Продвинутый
  • ***
  • Сообщений: 967
  • Репутация: 61
    • Награды
Есть следующий массив:
Постановление главы администрации Краснодарского края от 13.09.2010 N 871
Постановление главы администрации Краснодарского края от 25.04.2006 N 285
Постановление главы администрации Краснодарского края от 22.02.2005 N 149
Постановление главы администрации Краснодарского края от 17.07.2006 N 621
Постановление главы администрации Краснодарского края от 06.02.2009 N 79
Постановление главы администрации Краснодарского края от 03.09.2007 N 796
Постановление главы администрации Краснодарского края от 08.08.2007 N 725
Постановление главы администрации Краснодарского края от 19.12.2008 N 1217
Постановление главы администрации Краснодарского края от 24.10.2006 N 923
...

Необходимо отсортировать следующим образом: вверху должны идти документы с самой свежей датой, если у документов одинаковая дата, то вверху должен идти документ с максимальным номером.


Добавлено: Май 14, 2010, 22:20:25
Причем, как вы понимаете, под свежей датой имеется
1) самый большой год
2) потом самый большой месяц
3) потом самый большой день

т.е. в строке (13).(09).(2010) N (1313) необходимо сначала сравнивать 3-й элемент, потом 2-й, потом 1-й, а потом 4-й.


Добавлено: Май 14, 2010, 22:37:40
OffTopicОфф. На Perl это делается примерно так:

@array=sort{($a=~ /(\d+) N/)[0] <=> ($b=~ /(\d+) N/)[0] 
                    ||
($a=~ /\.(\d+)\./)[0] <=> ($b=~ /\.(\d+)\./)[0]
                   ||
($a=~ / от (\d+)/)[0] <=> ($b=~ /от (\d+)/)[0]
                  ||
($a=~ / N (\d+)/)[0] <=> ($b=~ / N (\d+)/)[0]}@unsorted;
« Последнее редактирование: Май 14, 2010, 22:38:08 от Suppir, Причина: Объединение сообщений »

Русское сообщество AutoIt


Оффлайн dwerf [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 478
  • Репутация: 218
  • Пол: Мужской
  • Использует ArchLinux
    • Награды
Сваял нечто похожее для соротировки процессов в моей программе.
Как то так (Ctrl+NumPlus разворачивает ListView):
(нажмите для показа/скрытия)
00110110001000001101000011010011001

Оффлайн snoitaleR [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 854
  • Репутация: 222
  • Пол: Мужской
    • Награды
Suppir
Мой вариант:

Код: AutoIt [Выделить]
; НАЧАЛО

; Библиотеки

 #include <array.au3>

 Dim $ARRAY[9]=["Постановление главы администрации Краснодарского края от 13.09.2010 N 871", _
                "Постановление главы администрации Краснодарского края от 25.04.2006 N 285", _
                "Постановление главы администрации Краснодарского края от 22.02.2005 N 149", _
                "Постановление главы администрации Краснодарского края от 17.07.2006 N 621", _
                "Постановление главы администрации Краснодарского края от 17.07.2006 N 700", _
                "Постановление главы администрации Краснодарского края от 03.09.2007 N 796", _
                "Постановление главы администрации Краснодарского края от 08.08.2007 N 725", _
                "Постановление главы администрации Краснодарского края от 19.12.2008 N 1217", _
                "Постановление главы администрации Краснодарского края от 24.10.2006 N 923"]

 Dim $ACODE[UBound($ARRAY)][2]

 For $iARRAY=0 To UBound($ARRAY)-1

  $ACODE[$iARRAY][0]=StringRegExpReplace($ARRAY[$iARRAY],"(.*)(\d\d)(\.)(\d\d)(\.)(\d\d\d\d)(.*)","\6\5\4\3\2")&"."&StringFormat("%05d",StringRegExpReplace($ARRAY[$iARRAY],"(.*)(N )(\d+)","\3"))
  $ACODE[$iARRAY][1]=$ARRAY[$iARRAY]

 Next

 _ArraySort($ACODE,1)

 For $iARRAY=0 To UBound($ARRAY)-1

  $ARRAY[$iARRAY]=$ACODE[$iARRAY][1]

 Next

 _ArrayDisplay($ARRAY)

; КОНЕЦ
 



Добавлено: Май 16, 2010, 20:09:46
Suppir
Немного видоизменил и оптимизировал скрипт:

Код: AutoIt [Выделить]
; НАЧАЛО

; Библиотеки

 #include <array.au3>

; Объявление массива

 Dim $A[9][2]

; Заполнение нулевого размера

 $A[0][0]="Постановление главы администрации Краснодарского края от 13.09.2010 N 871"
 $A[1][0]="Постановление главы администрации Краснодарского края от 25.04.2006 N 285"
 $A[2][0]="Постановление главы администрации Краснодарского края от 22.02.2005 N 149"
 $A[3][0]="Постановление главы администрации Краснодарского края от 17.07.2006 N 621"
 $A[4][0]="Постановление главы администрации Краснодарского края от 17.07.2006 N 700"
 $A[5][0]="Постановление главы администрации Краснодарского края от 03.09.2007 N 796"
 $A[6][0]="Постановление главы администрации Краснодарского края от 08.08.2007 N 725"
 $A[7][0]="Постановление главы администрации Краснодарского края от 19.12.2008 N 1217"
 $A[8][0]="Постановление главы администрации Краснодарского края от 24.10.2006 N 923"

; Заполнение первого размера

 For $iA=0 To UBound($A)-1

  $A[$iA][1]=StringRegExpReplace($A[$iA][0],"(.*)(\d\d)(\.)(\d\d)(\.)(\d\d\d\d)(.*)","\6\4\2")&StringFormat("%05d",StringRegExpReplace($A[$iA][0],"(.*)(N )(\d+)","\3"))

 Next

; Сортировка по первому размеру

 _ArraySort($A,1,0,0,1)

; Отображение отсортированного массива

 _ArrayDisplay($A)

; КОНЕЦ
 

« Последнее редактирование: Май 16, 2010, 20:09:47 от snoitaleR, Причина: Объединение сообщений »
Главное в жизни человека - это отношение...

Оффлайн Suppir [?]

  • Продвинутый
  • ***
  • Сообщений: 967

  • Автор темы
  • Репутация: 61
    • Награды
snoitaleR
вроде работает, только я не совсем понимаю, каким образом   :-[ Не мог бы ты немножко пояснить алгоритм...

Русское сообщество AutoIt

Re: Сложная сортировка массива (по дате и номеру)
« Ответ #3 Отправлен: Май 16, 2010, 19:27:58 »

Оффлайн snoitaleR [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 854
  • Репутация: 222
  • Пол: Мужской
    • Награды
Suppir
Есть предыстория... Я очень долго искал способ создания уникальных имен документов и всевозможных пометок, которые бы ни в коем случае не повторялись... И я нашел способ: YYYY-MM-DD-hh-mm-ss... Для событий из жизни людей практически невозможно получить два события с одинаковым YYYY-MM-DD-hh-mm-ss... У этого "псевдослучайного" кода есть важная особенность - правильная сортировка по времени...
В решении твоей задачи я просто заменил часы-минуты-секунды на номер документа и получил код: YYYYMMDDnnnnn...
Функция _ArraySort() позволяет сортировать 2-мерный массив по любому измерению... А в качество измерения для сортировки я выбрал измерение с кодами YYYYMMDDnnnnn...
Если бы даты нужно было упорядочить по убыванию, а номера документов по возрастанию, то данный алгоритм было бы использовать нельзя, так как я объединил даты и номера в одно измерение... :)

Оффлайн Suppir [?]

  • Продвинутый
  • ***
  • Сообщений: 967

  • Автор темы
  • Репутация: 61
    • Награды
Хитро!

Русское сообщество AutoIt

Re: Сложная сортировка массива (по дате и номеру)
« Ответ #5 Отправлен: Май 16, 2010, 20:52:55 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
3 Ответов
3166 Просмотров
Последний ответ Ноябрь 11, 2010, 19:01:13
от alexnasa
5 Ответов
4703 Просмотров
Последний ответ Октябрь 25, 2011, 19:14:55
от dimachn
3 Ответов
2239 Просмотров
Последний ответ Ноябрь 14, 2011, 11:52:06
от ---Zak---
0 Ответов
2136 Просмотров
Последний ответ Ноябрь 14, 2011, 11:27:11
от Kaster
6 Ответов
2940 Просмотров
Последний ответ Март 04, 2012, 19:02:01
от Krokodile
4 Ответов
3353 Просмотров
Последний ответ Июнь 24, 2012, 12:05:10
от 111RAZOR111
0 Ответов
2436 Просмотров
Последний ответ Июль 17, 2012, 11:39:03
от 111RAZOR111
2 Ответов
2882 Просмотров
Последний ответ Август 04, 2013, 15:57:17
от Garrett
2 Ответов
1160 Просмотров
Последний ответ Январь 28, 2015, 17:59:18
от shyra1976
22 Ответов
4056 Просмотров
Последний ответ Март 09, 2016, 01:05:50
от Alofa