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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите написать функцию для сортировки списка

Помогите написать функцию для сортировки списка

Ответ
Поиск в этой теме
Непрочитано 24.07.2011, 17:42 #1
Помогите написать функцию для сортировки списка
proektant-minsk
 
Проектировщик ОВ
 
Минск
Регистрация: 15.10.2010
Сообщений: 42

Задачу сформулирую на примере:

Список ...

(list
(list("параметр" . "x") ("значение" . "1"))
(list("параметр" . "x") ("значение" . "2"))
(list("параметр" . "x") ("значение" . "3"))
(list("параметр" . "y") ("значение" . "1"))
(list("параметр" . "y") ("значение" . "3"))
(list("параметр" . "y") ("значение" . "5"))
(list("параметр" . "z") ("значение" . "2"))
(list("параметр" . "z) ("значение" . "4"))
)

... обрабатывается функцией, которая возращает ...

(list
(list("параметр" . "x") ("значение" . "6)("кол" . "3")) ; 6 = 1 + 2 + 3
(list("параметр" . "y") ("значение" . "9")("кол" . "3")) ; 9 = 1 + 3 + 5
(list("параметр" . "z") ("значение" . "6")("кол" . "2")) ; 6 = 4 + 2
)

спасибо, тем кто окликнется )))
Просмотров: 5950
 
Непрочитано 24.07.2011, 18:32
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Посмотри справку по функциям assoc и subst.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.07.2011, 19:20
#3
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Не совсем понятно именно что нужно, но наверное это
Код:
[Выделить все]
 (setq i1 0 i11 0 i2 0 i22 0 i3 0 i33 0)
(mapcar '(lambda (x) (cond
		       (
			(eq "x" (cdr(car x)))
			(setq i1 (+ i1 (read(cdr(cadr x)))))
			(setq i11 (1+ i11))
			(setq lst1 (list (car x) (cons "значение" (itoa i1)) (cons "кол" (itoa i11))))
			)
		       (
			(eq "y" (cdr(car x)))
			(setq i2 (+ i2 (read(cdr(cadr x)))))
			(setq i22 (1+ i22))
			(setq lst2 (list (car x) (cons "значение" (itoa i2)) (cons "кол" (itoa i22))))
			)
		       (
			(eq "z" (cdr(car x)))
			(setq i3 (+ i3 (read(cdr(cadr x)))))
			(setq i33 (1+ i33))
			(setq lst3 (list (car x) (cons "значение" (itoa i3)) (cons "кол" (itoa i33))))
			)
		       )
	   )
	(list
	  (list '("параметр" . "x") '("значение" . "1"))
	  (list '("параметр" . "x") '("значение" . "2"))
	  (list '("параметр" . "x") '("значение" . "3"))
	  (list '("параметр" . "y") '("значение" . "1"))
	  (list '("параметр" . "y") '("значение" . "3"))
	  (list '("параметр" . "y") '("значение" . "5"))
	  (list '("параметр" . "z") '("значение" . "2"))
	  (list '("параметр" . "z") '("значение" . "4"))
	  )
	)
(list lst1 lst2 lst3)
Oliver_88 вне форума  
 
Непрочитано 24.07.2011, 19:43
#4
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Offtop: То Oliver_88 поставтье себе закладку на этой странице и посмотрите на нее года через два (так и запишите посмотреть 24.07.2013) - уверяю Вас самому интересно будет
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.07.2011, 19:50
#5
gomer

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


Цитата:
Сообщение от proektant-minsk Посмотреть сообщение
спасибо, тем кто окликнется
лови
Код:
[Выделить все]
 (defun list->set (lst)
  (if (null lst)
    lst
    (if	(member (car lst) (cdr lst))
      (list->set (cdr lst))
      (cons (car lst) (list->set (cdr lst)))
    )
  )
)

(setq lst (list
	    '(("параметр" . "x") ("значение" . "1")) '(("параметр" . "x") ("значение" . "2"))
	    '(("параметр" . "x") ("значение" . "3")) '(("параметр" . "y") ("значение" . "1"))
	    '(("параметр" . "y") ("значение" . "3")) '(("параметр" . "y") ("значение" . "5"))
	    '(("параметр" . "z") ("значение" . "2")) '(("параметр" . "z") ("значение" . "4")))
)

(mapcar
  '(lambda (y)
     (list
       (cons "параметр" y)
       (cons
	 "значение"
	 (itoa
	   (apply
	     '+
	     (mapcar '(lambda (x) (atoi (cdr (assoc "значение" x))))
		     (vl-remove-if-not
		       '(lambda (x) (eq y (cdr (assoc "параметр" x))))
		       lst
		     )
	     )
	   )
	 )
       )
       (cons
	 "кол."
	 (itoa
	   (length (vl-remove-if-not
		     '(lambda (x) (eq y (cdr (assoc "параметр" x))))
		     lst
		   )
	   )
	 )
       )
     )
   )
  (list->set
    (mapcar '(lambda (x) (cdr (assoc "параметр" x))) lst)
  )
)
gomer вне форума  
 
Автор темы   Непрочитано 24.07.2011, 19:55
#6
proektant-minsk

Проектировщик ОВ
 
Регистрация: 15.10.2010
Минск
Сообщений: 42


To Oliver_88 : x,y,z - это условный пример, на самом деле этих параметров может быть больше и не обязательно с такими названиями. То есть я хочу сказать что функция должна быть универсальной.
Вот пример реальных данных. То есть надо для каждого стояка просуммировать нагрузку.
(
(("СТОЯК" . "1") ("НАГРУЗКА" . "1000"))
(("СТОЯК" . "1") ("НАГРУЗКА" . "3000"))
(("СТОЯК" . "1") ("НАГРУЗКА" . "3000"))
(("СТОЯК" . "1") ("НАГРУЗКА" . "2000"))
(("СТОЯК" . "1") ("НАГРУЗКА" . "1000"))
(("СТОЯК" . "2") ("НАГРУЗКА" . "5000"))
(("СТОЯК" . "2") ("НАГРУЗКА" . "5000"))
(("СТОЯК" . "2") ("НАГРУЗКА" . "5000"))
(("СТОЯК" . "3") ("НАГРУЗКА" . "2000"))
(("СТОЯК" . "3") ("НАГРУЗКА" . "1000"))
(("СТОЯК" . "3") ("НАГРУЗКА" . "500"))
(("СТОЯК" . "3") ("НАГРУЗКА" . "100"))
(("СТОЯК" . "4") ("НАГРУЗКА" . "2200"))
(("СТОЯК" . "4") ("НАГРУЗКА" . "4400"))
(("СТОЯК" . "4") ("НАГРУЗКА" . "5000"))
(("СТОЯК" . "5") ("НАГРУЗКА" . "1000"))
(("СТОЯК" . "5") ("НАГРУЗКА" . "1000"))
(("СТОЯК" . "5") ("НАГРУЗКА" . "4500"))
(("СТОЯК" . "5") ("НАГРУЗКА" . "2000"))
)


To Дима_ : спасибо, уже смотрел) просто мне интересно посмотреть как программисты более высокого уровня решат такую, на мой взгляд, класическую задачу,
proektant-minsk вне форума  
 
Непрочитано 24.07.2011, 19:57
#7
gomer

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


скажи еще, что сам уже ее решил
gomer вне форума  
 
Автор темы   Непрочитано 24.07.2011, 20:02
#8
proektant-minsk

Проектировщик ОВ
 
Регистрация: 15.10.2010
Минск
Сообщений: 42


Цитата:
Сообщение от gomer Посмотреть сообщение
скажи еще, что сам уже ее решил
неа) а как убрать нумерацию строк из кода на сайте, когда я копирую через буфер для запуска?
proektant-minsk вне форума  
 
Непрочитано 24.07.2011, 20:10
#9
gomer

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


Цитата:
Сообщение от proektant-minsk Посмотреть сообщение
как убрать нумерацию строк из кода на сайте
нажми на листик с синими скобочками <>
gomer вне форума  
 
Непрочитано 24.07.2011, 20:12
#10
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Ну точно не правильно понял.
Дима_, гляну, если не заброшу к тому времени.
Oliver_88 вне форума  
 
Непрочитано 29.07.2011, 01:48
#11
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Еще одна попытка чайника:
Код:
[Выделить все]
 (defun lt (/ lst lst1 el lst2)
  (setq lst '(
	      (("СТОЯК" . "1") ("НАГРУЗКА" . "1000"))
	      (("СТОЯК" . "1") ("НАГРУЗКА" . "3000"))
	      (("СТОЯК" . "1") ("НАГРУЗКА" . "2000"))
	      (("СТОЯК" . "1") ("НАГРУЗКА" . "1000"))
	      (("СТОЯК" . "2") ("НАГРУЗКА" . "5000"))
	      (("СТОЯК" . "2") ("НАГРУЗКА" . "5000"))
	      (("СТОЯК" . "2") ("НАГРУЗКА" . "5000"))
	      (("СТОЯК" . "3") ("НАГРУЗКА" . "2000"))
	      (("СТОЯК" . "3") ("НАГРУЗКА" . "1000"))
	      (("СТОЯК" . "3") ("НАГРУЗКА" . "500"))
	      (("СТОЯК" . "3") ("НАГРУЗКА" . "100"))
	      (("СТОЯК" . "4") ("НАГРУЗКА" . "2200"))
	      (("СТОЯК" . "5") ("НАГРУЗКА" . "1000"))
	      (("СТОЯК" . "5") ("НАГРУЗКА" . "1000"))
	      (("СТОЯК" . "5") ("НАГРУЗКА" . "4500"))
	      (("СТОЯК" . "6") ("НАГРУЗКА" . "2000"))
	      (("СТОЯК" . "7") ("НАГРУЗКА" . "2000"))
	      (("СТОЯК" . "7") ("НАГРУЗКА" . "2000"))
	      ))
  (setq lst1 lst)
  (while
    (setq lst1 lst)
    (setq el (cdaar lst))
    (setq lst1 (vl-remove-if-not '(lambda (x) (eq el (cdar x))) lst1))
    (setq lst (vl-remove-if '(lambda (x) (eq el (cdar x))) lst))
    (setq lst1 (list (caar lst1)
		     (cons (caadar lst1) (itoa(eval (cons '+ (mapcar '(lambda (x) (read (cdadr x))) lst1)))))
		     (cons "кол." (itoa(length lst1)))
		     )
	  )
    (setq lst2 (cons lst1 lst2)))
  (reverse lst2)
  )
Oliver_88 вне форума  
 
Непрочитано 04.08.2011, 09:35
#12
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589


Offtop: Оффтоп.
Вот смотрю я на программы и завидую белой завистью людям.
К сожаления я на VB очень обленился и для сортировки использую БД, прямо как гвоздь микроскопом. Стыдно мне за это.
Boxa вне форума  
 
Непрочитано 04.08.2011, 11:24
#13
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


мой набросок, через рекурсию:
Код:
[Выделить все]
 
(defun test (l)
 (defun f (l)
  (cond ((not l) l)
        ((= (caar l) (caadr l)) (f (cons (cons (caar l) (mapcar (function +) (cdar l) (cdadr l))) (cddr l))))
        ((cons (list (cons "СТОЯК" (caar l)) (cons "НАГРУЗКА" (itoa (cadar l))) (cons "КОЛ" (itoa (caddar l)))) (f (cdr l))))
  )
 )
 (f (vl-sort (mapcar (function (lambda (a) (list (cdar a) (atoi (cdadr a)) 1))) l) (function (lambda (a b) (<= (car a) (car b))))))
)
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите написать функцию для сортировки списка

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите сделать сортировку списка атрибутов блока Wertgan Программирование 11 30.04.2015 17:17
помогите написать программу расчета температуры MathCad Olga12345 Другие CAD системы 4 22.02.2011 15:25
Пожалуста помогите правельно написать формулу для Schedule- спецификации tighineanur Вертикальные решения на базе AutoCAD 6 24.02.2009 11:24
Помогите написать два простых макроса для Excel, PLS kp+ Программирование 5 09.06.2007 18:48
Как написать функцию, которая возвращает неск. результатов? kp+ Программирование 9 14.01.2006 02:00