Lisp. Сортировка. Как сделать правильно?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Lisp. Сортировка. Как сделать правильно?

Lisp. Сортировка. Как сделать правильно?

Ответ
Поиск в этой теме
Непрочитано 27.11.2014, 20:25 #1
Lisp. Сортировка. Как сделать правильно?
Kirill_Ja
 
Мурманск
Регистрация: 28.07.2008
Сообщений: 208

День добрый. Довольно часто встречается ситуация, когда нужно отсортировать список. Еще бывает нужно отсортировать список 2 раза.
Бывает, что список нужно отсортировать 3 и более раз.
И тут я взглянул на свой код и понял: "Мне нужна помощь..."

Допистим у нас есть список

Код:
[Выделить все]
 '(
(("A" 3) ("B" 1) ("C" 1))
(("A" 3) ("B" 2) ("C" 1))
(("A" 2) ("B" 1) ("C" 1))
(("A" 1) ("B" 1) ("C" 1))
(("A" 3) ("B" 2) ("C" 2)
)
Нужно отсортировать его по значению пары A, потом результирующий список - по значению пары B и, наконец пара C.
Чтобы было понятнее - как будто у нас отдельные главы книги есть вперемешку и надо их собрать вместе. A - Том B - Глава C - Параграф.
Можно как-то решить эту задачу в общем виде (т.е. для произвольного количества сортировок)?
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.
Просмотров: 4397
 
Непрочитано 27.11.2014, 20:41
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


В поиск, похожих решений полно
gomer вне форума  
 
Непрочитано 27.11.2014, 20:43
1 | #3
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Код:
[Выделить все]
(setq lst '(
	    (("A" 3) ("B" 1) ("C" 1))
	    (("A" 3) ("B" 2) ("C" 1))
	    (("A" 2) ("B" 1) ("C" 1))
	    (("A" 1) ("B" 1) ("C" 1))
	    (("A" 3)("B" 2)("C" 2))
	   )
)
(vl-sort lst
	 (function
	   (lambda (a b)
	     (or
	       (< (cadar a) (cadar b))
	       (and
		 (= (cadar a) (cadar b))
		 (< (cadadr a) (cadadr b))
	       )
	       (and
		 (= (cadar a) (cadar b))
		 (= (cadadr a) (cadadr b))
		 (< (cadr (caddr a)) (cadr (caddr b)))
	       )
	     )
	   )
	 )
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 27.11.2014, 21:44
#4
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Как всегда изобретаю велосипед)) Спасибо за идею)
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.
Kirill_Ja вне форума  
 
Автор темы   Непрочитано 29.11.2014, 20:20
#5
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Код:
[Выделить все]
 (defun tgg_list_sort_by_steps (in_list function_list / membrs sort_ f_cur debug_)
(setq f_cur (car function_list))
(setq sort_
       (vl-sort-i
	 (mapcar
	   (function (lambda (x / tmp)
		       (setq tmp ((eval f_cur) x))
		       (if (not (member tmp membrs)) (setq membrs (append membrs (list tmp))))
		       tmp))
	   in_list) '<))
 (setq membrs (vl-sort membrs '<))
 (setq in_list (mapcar (function (lambda (x) (nth x in_list))) sort_))

(if (setq function_list (cdr function_list))
     (setq in_list
      (apply 'append
       (mapcar
         (function
           (lambda (x)
             (tgg_list_sort_by_steps
	       (vl-remove-if-not
		 (function (lambda (y) (= x ((eval f_cur) y)))) in_list)
	       function_list)
	     )
	   ) membrs)
	 )))
in_list
);_defun
Я думал про что-то вот такого рода. Сортировать списки можно сколько угодно раз и по любым значениям из этого списка полученным.

$ inn
((("A" 3) ("B" 1) ("C" 1)) (("A" 3) ("B" 2) ("C" 1)) (("A" 2) ("B" 1) ("C" 1)) (("A" 1) ("B" 1) ("C" 1)) (("A" 3) ("B" 2) ("C" 2)))
_$ f_list
((quote #<USUBR @0000000035299908 -lambda->) (quote #<USUBR @0000000035299930 -lambda->) (quote #<USUBR @0000000035299958 -lambda->))
_$ (TGG_LIST_SORT_BY_STEPS inn f_list)
((("A" 1) ("B" 1) ("C" 1)) (("A" 2) ("B" 1) ("C" 1)) (("A" 3) ("B" 1) ("C" 1)) (("A" 3) ("B" 2) ("C" 1)) (("A" 3) ("B" 2) ("C" 2)))
_$
Где f_list (list (function (lambda (f) (cadr (assoc "A" f) ))) (function (lambda (f) (cadr (assoc "B" f) ))) (function (lambda (f) (cadr (assoc "C" f) ))))


А еще можно прикрутить выбор способа сортировки (я имею в виду передавать функцию-аргумент для vl-sort) и получить просто терминатора.
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.

Последний раз редактировалось Kirill_Ja, 29.11.2014 в 20:21. Причина: Еще мысль
Kirill_Ja вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Lisp. Сортировка. Как сделать правильно?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Код на VBA. помогите сделать правильно блок выбора объектов ssn Программирование 12 28.11.2013 15:08
Как правильно сделать ссылку на аналогичный разрез HEVOD Прочее. Архитектура и строительство 8 28.10.2013 13:27
Как правильно сделать чердачное перекрытие и кровлю? mixxa Конструкции зданий и сооружений 5 16.12.2011 10:33