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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Сортировка списка (элементы текст) по возрастанию

Сортировка списка (элементы текст) по возрастанию

Ответ
Поиск в этой теме
Непрочитано 03.05.2011, 14:33 1 | #1
Сортировка списка (элементы текст) по возрастанию
sdv79
 
Инженер ЭОМ
 
Москва
Регистрация: 05.03.2009
Сообщений: 215

Есть список вида
(setq removing_list (list "П2" "П22" "П12" "П2" "П1" "Т1"))
Необходимо отсортировать по возрастанию и убрать дублирующие наполнение списка может быть разное на пример “ШР1” (“ЩАО2” “ЩО6” "ЩАО2-1" "ЩР 2.1" …)
Итого ("П1" "П2" "П12" "П22" "Т1"))

Мой вариант, работает не корректно
Код:
[Выделить все]
(defun c:vl_sort_text
       (
    removing_list    
    /
    ;text_unique
       )
 (setq removing_list    (vl-sort removing_list '> ) )
 (while (/= nil removing_list)
  (setq    text_unique_cons(cons(car removing_list)text_unique_cons)
      removing_list    (vl-remove(car removing_list)removing_list)
  ) ;/ setq
 ) ; / while
 (setq text_unique    text_unique_cons
       text_unique_cons nil)
 text_unique
); /defun (c:vl_sort_text removing_list)


пример запуска
(c:vl_sort_text (list "П2" "П22" "П12" "П2" "П1" "Т1"))

Последний раз редактировалось sdv79, 03.05.2011 в 16:06.
Просмотров: 9268
 
Непрочитано 03.05.2011, 14:36
#2
Дима_

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


а чем не устраивает стандартный vl-sort?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 03.05.2011, 14:42
#3
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


vl-sort в коде присутствует желаемого результата не дает
sdv79 вне форума  
 
Непрочитано 03.05.2011, 14:52
#4
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


sdv79, а почему для (setq removing_list (list "П2" "П22" "П12" "П2" "П1" "Т1"))
Итого ("П1" "П2" "П12" "П22" "Т1")), а не ("П1" "П12" "П2" "П22" "Т1")). Я почему спрашиваю, ведь есть же функция acad_strlsort - позволяет отсортировать по возрастанию список, эл-ами которого являются строки, так вот они и вернет
Код:
[Выделить все]
 
_$ (acad_strlsort (list "П2" "П22" "П12" "П2" "П1" "Т1"))
("П1" "П12" "П2" "П22" "Т1")
P.S. ну удаление дубликтов отдельно конечно же обрабатывается
__________________
cadtools

Последний раз редактировалось TararykovDG, 03.05.2011 в 14:59.
TararykovDG вне форума  
 
Автор темы   Непрочитано 03.05.2011, 15:00
#5
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


TararykovDG заметьте что возвращает
П1 а следом П12
а нужно П1 П2 П12 и т д
sdv79 вне форума  
 
Непрочитано 03.05.2011, 15:01
#6
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


Код:
[Выделить все]
 (vl-sort ((lambda (/ res)
            (foreach item removing_list
              (if (not (member item res))
                (setq res (cons item res))
                ) ;_ end of if
              ) ;_ end of foreach
            ) ;_ end of lambda
          )
         '(lambda (a b) (< a b))
         ) ;_ end of vl-sort
Код:
[Выделить все]
 (acad_strlsort
  ((lambda (/ res)
     (foreach item removing_list
       (if (not (member item res))
         (setq res (cons item res))
         ) ;_ end of if
       ) ;_ end of foreach
     ) ;_ end of lambda
   )
  ) ;_ end of acad_strlsort
А сортировка типа П1-П2-П10-П21 и т.д. - отдельная песня.
__________________
(/= RegDate StartReadDate)

Последний раз редактировалось Лиспер, 03.05.2011 в 15:06.
Лиспер вне форума  
 
Непрочитано 03.05.2011, 15:06
#7
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от sdv79 Посмотреть сообщение
TararykovDG заметьте что возвращает
П1 а следом П12
а нужно П1 П2 П12 и т д
Так вот я об этом и спрашиваю, если П12 должно идти после П2, то это уже не "Сортировка списка (элементы текст) по возрастанию", а Ваша личная сортировка, по вашим правилам.
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 03.05.2011, 15:58
#8
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


TararykovDG
Вероятно я не смог корректно донести свой вопрос
необходимо привести список вида
("П2" "П22" "П12" "П2" "П1" "Т1")) к списку вида
("П1" "П2" "П12" "П22" "Т1"))
вариант
("П1" "П12" "П2" "П22" "Т1") не устраивает

Лиспер ваш код не дает решение вопроса
к тому же вы правильно заметили, возможны варианты с тире или точнкой
("ПК2-1" "П22-2" "П12-1" "П2-2 "П1" "Т1"))
пользователь может произвольное имя дать
sdv79 вне форума  
 
Непрочитано 03.05.2011, 16:00
#9
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


sdv79, на приведенном примере код дает вполне ожидаемый результат. А насчет того, что "пользователь может произвольное имя дать": неопределенность исходных условий гарантирует отсутствие результата.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 03.05.2011, 16:11
#10
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


Лиспер, в том то и дело, я имею ИМЕНА ящиков, которые пользователь запишет как угодно, и ограничеть его никак нельзя.
(
Помогите с кодом!!!
sdv79 вне форума  
 
Непрочитано 03.05.2011, 16:31
#11
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


http://www.theswamp.org/index.php?topic=6474.0 ?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 03.05.2011, 16:37
#12
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


Лиспер в первом приближении-СУПЕР!!!
Спасибо большое.
+1 к уважению.
sdv79 вне форума  
 
Непрочитано 03.05.2011, 19:54
#13
VVA

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


Вариант сортировки строк как чисел можно посмотреть на болоте здесь:
Search of Windows type Sort function
или на dwg.ru
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 04.05.2011, 22:32
#14
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


Всем большое спасибо.
sdv79 вне форума  
 
Непрочитано 02.01.2012, 17:39
#15
WST


 
Регистрация: 21.04.2011
Сообщений: 135


Подниму тему как наиболее подходящею
имеется список типа:
(("ЩО-1" "Гр 2" 1.2) ("ЩО-1" "Гр 4" 3.0) ("ЩО-1" "Гр 5" 0.8) ("ЩО-2" "Гр 2" 1.0) ("ЩО-2" "Гр 1" 1.5) ("ЩО-1" "Гр 1" 2.0) ("ЩО-1" "Гр 3" 1.0) ("ЩО-2" "Гр 3" 1.5) ("ЩО-3" "Гр 2" 1.7) ("ЩО-3" "Гр 1" 1.8))
нужно получить список типа:
(("ЩО-1" "Гр 1" 2.0) ("ЩО-1" "Гр 2" 1.2) ("ЩО-1" "Гр 3" 1.0) ("ЩО-1" "Гр 4" 3.0) ("ЩО-1" "Гр 5" 0.8) ("ЩО-2" "Гр 1" 1.5) ("ЩО-2" "Гр 2" 1.0) ("ЩО-2" "Гр 3" 1.5) ("ЩО-3" "Гр 1" 1.8) ("ЩО-3" "Гр 2" 1.7))
то есть нужно отсортировать список по возрастанию первых двух элементов под списка третий элемент не участвует в сортировки
всем заранее спасибо
WST вне форума  
 
Непрочитано 02.01.2012, 19:27
#16
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от WST Посмотреть сообщение
Подниму тему как наиболее подходящею
имеется список типа:
(("ЩО-1" "Гр 2" 1.2) ("ЩО-1" "Гр 4" 3.0) ("ЩО-1" "Гр 5" 0.8) ("ЩО-2" "Гр 2" 1.0) ("ЩО-2" "Гр 1" 1.5) ("ЩО-1" "Гр 1" 2.0) ("ЩО-1" "Гр 3" 1.0) ("ЩО-2" "Гр 3" 1.5) ("ЩО-3" "Гр 2" 1.7) ("ЩО-3" "Гр 1" 1.8))
нужно получить список типа:
(("ЩО-1" "Гр 1" 2.0) ("ЩО-1" "Гр 2" 1.2) ("ЩО-1" "Гр 3" 1.0) ("ЩО-1" "Гр 4" 3.0) ("ЩО-1" "Гр 5" 0.8) ("ЩО-2" "Гр 1" 1.5) ("ЩО-2" "Гр 2" 1.0) ("ЩО-2" "Гр 3" 1.5) ("ЩО-3" "Гр 1" 1.8) ("ЩО-3" "Гр 2" 1.7))
то есть нужно отсортировать список по возрастанию первых двух элементов под списка третий элемент не участвует в сортировки
всем заранее спасибо
Тоже уже было и не раз, искать дольше чем заново написать, как-то так
Код:
[Выделить все]
 
; lst - исходный список
(vl-sort lst '(lambda(e1 e2) (if (= (car e1) (car e2)) (< (cadr e1) (cadr e2)) (< (car e1) (car e2)))))
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 02.01.2012, 20:45
#17
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


1 и 2 элемент списка сложи при помощи strcat, чтобы получить список вида

("ЩО-1Гр 1" "ЩО-1Гр 2" "ЩО-1Гр 3" "ЩО-1Гр 4" "ЩО-1Гр 12" "ЩО-2Гр 1" "ЩО-2Гр 2"
"ЩО-2Гр 3" "ЩО-3Гр 1" "ЩО-3Гр 2")

Теперь сортируй при помощи функций от VVA (сортировка строк как чисел).

В общем, такой код - с использованием моей функции (сделана на основе функции VVA):

Код:
[Выделить все]
 ;lst - исходный список
(mapcar
  '(lambda(x)
     (nth x lst))
  (adv-strings-sort-strings-with-numbers-i
    (mapcar '(lambda (x) (strcat (nth 0 x) (nth 1 x))) lst) T)
  )
Сама функция:

Код:
[Выделить все]
 ;;===============================================
;функция сортирует строки с буквами и номерами, сначала по буквам,
;потом по номерам, в порядке возрастания (сортировка марок кабеля)
;Функция возвращает список из индексов элементов первоначального списка
(defun adv-strings-sort-strings-with-numbers-i
       (ListOfString IgnoreCase / 
	_NormalizeNumberInString 
	_getcount
	NorStrs count)

;;================================================

;;;Function Normalize (add 0 befor number) number in string
;;; Count normalize symbols set in variable count
;;; CAB added count as an argument
  (defun _NormalizeNumberInString (str count / ch i pat ret buf)
    (setq i   0
          pat '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9")
          ret ""
    ) ;_ end of setq
    (while (/= (setq ch (substr str (setq i (1+ i)) 1)) "")
      (if (vl-position ch pat)
        (progn
          (setq buf ch) ;_ end of setq
          (while
            (vl-position (setq ch (substr str (setq i (1+ i)) 1)) pat)
             (setq buf (strcat buf ch))
          ) ;_ end of while
          (while (< (strlen buf) count) (setq buf (strcat "0" buf)))
          (setq ret (strcat ret buf))
        ) ;_ end of progn
      ) ;_ end of if
      (setq ret (strcat ret ch))
    ) ;_ end of while
    ret
  ) ;_ end of defun
  ;;=======================================

  ;;  function to Count the longest number in string 
  ;;  CAB added to get the correct COUNT
  (defun _getcount (lst / count pat)
    (setq count 0)
    (setq pat '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9"))
    (mapcar
      '(lambda (str / i maxlen ch)
         (setq i 0
               maxlen 0
         ) ;_ end of setq
         (while (/= (setq ch (substr str (setq i (1+ i)) 1)) "")
           (if (vl-position ch pat)               ; number
             (setq maxlen (1+ maxlen))
             (setq count  (max count maxlen)
                   maxlen 0
             ) ;_ end of setq
           ) ;_ end of if
         ) ;_ end of while
         (setq count (max count maxlen)) ;_<<< ADD 21.06.2007 by 
       ) ;_ end of lambda
      Lst
    ) ;_ end of mapcar
    count
  ) ;_ end of defun
  ;;===============================================
  (setq count   (_GetCount ListOfString)
        NorStrs (mapcar '(lambda (x) (_NormalizeNumberInString x count))
                        ListOfString
                ) ;_ end of mapcar
  ) ;_ end of setq
  (and IgnoreCase (setq NorStrs (mapcar 'strcase NorStrs)))
          (vl-sort-i NorStrs '<)
) ;_ end of adv-strings-sort-strings-with-numbers
Frigate вне форума  
 
Непрочитано 02.01.2012, 22:23
#18
WST


 
Регистрация: 21.04.2011
Сообщений: 135


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
Тоже уже было и не раз, искать дольше чем заново написать, как-то так
Код:
[Выделить все]
 
; lst - исходный список
(vl-sort lst '(lambda(e1 e2) (if (= (car e1) (car e2)) (< (cadr e1) (cadr e2)) (< (car e1) (car e2)))))
TararykovDG,
спасибо да такого я тоже додумался но это не то что мне нужно, используя этот код мы действительно получаем список типа:
(("ЩО-1" "Гр 1" 2.0) ("ЩО-1" "Гр 2" 1.2) ("ЩО-1" "Гр 3" 1.0) ("ЩО-1" "Гр 4" 3.0) ("ЩО-1" "Гр 5" 0.8) ("ЩО-2" "Гр 1" 1.5) ("ЩО-2" "Гр 2" 1.0) ("ЩО-2" "Гр 3" 1.5) ("ЩО-3" "Гр 1" 1.8) ("ЩО-3" "Гр 2" 1.7))
все хорошо если есть шиты ЩО-1...ЩО-9 и группы Гр 1...Гр 9 а если есть ЩО-1...ЩО-10 и группы Гр 1...Гр 10 код уже не подходит

Frigate,
и тебе спасибо но это не совсем то, если я правильно тебя понял ты предлагаешь создать список из первых двух сцепленных элементов под списка и их сортировать, но мне все токи нужен 3 элемент под списка только он не участвует в сортировки. И Данила раз уж ты откликнулся то может поможешь до конца с этим разобраться?
WST вне форума  
 
Непрочитано 02.01.2012, 22:50
#19
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


WST,

так ты попробуй - получается именно такой результат, какой тебе и нужен. 3-ий элемент не участвует в сортировке. А список из сцп=епленых элементов я слоздаю только для того, чтобы отсортировать. Мне кажется, ты не пробовал прогу. Она все считает, и учитывает то, что не учитывает код от TararykovDG


вот такой список, к примеру

Код:
[Выделить все]
  (setq lst '(("ЩО-1" "Гр 2" 1.2) ("ЩО-1" "Гр 4" 3.0) ("ЩО-1" "Гр 5" 0.8) ("ЩО-2" "Гр 2" 1.0) ("ЩО-2" "Гр 1" 1.5) ("ЩО-1" "Гр 1" 2.0) ("ЩО-1" "Гр 23" 1.0) ("ЩО-2" "Гр 3" 1.5) ("ЩО-3" "Гр 2" 1.7) ("ЩО-3" "Гр 12" 1.8)))
Получается вот так:

Код:
[Выделить все]
Команда: (setq lst '(("ЩО-1" "Гр 2" 1.2) ("ЩО-1" "Гр 4" 3.0) ("ЩО-1" "Гр 5" 
0.8) ("ЩО-2" "Гр 2" 1.0) ("ЩО-2" "Гр 1" 1.5) ("ЩО-1" "Гр 1" 2.0) ("ЩО-1" "Гр 
23" 1.0) ("ЩО-2" "Гр 3" 1.5) ("ЩО-3" "Гр 2" 1.7) ("ЩО-3" "Гр 12" 1.8)))
(("ЩО-1" "Гр 2" 1.2) ("ЩО-1" "Гр 4" 3.0) ("ЩО-1" "Гр 5" 0.8) ("ЩО-2" "Гр 2" 
1.0) ("ЩО-2" "Гр 1" 1.5) ("ЩО-1" "Гр 1" 2.0) ("ЩО-1" "Гр 23" 1.0) ("ЩО-2" "Гр 
3" 1.5) ("ЩО-3" "Гр 2" 1.7) ("ЩО-3" "Гр 12" 1.8))

Команда: (mapcar '(lambda(x)(nth x lst)) 
(adv-strings-sort-strings-with-numbers-i (mapcar '(lambda (x) (strcat (nth 0 x) 
(nth 1 x))) lst) T))
(("ЩО-1" "Гр 1" 2.0) ("ЩО-1" "Гр 2" 1.2) ("ЩО-1" "Гр 4" 3.0) ("ЩО-1" "Гр 5" 
0.8) ("ЩО-1" "Гр 23" 1.0) ("ЩО-2" "Гр 1" 1.5) ("ЩО-2" "Гр 2" 1.0) ("ЩО-2" "Гр 
3" 1.5) ("ЩО-3" "Гр 2" 1.7) ("ЩО-3" "Гр 12" 1.8))

а код бери из моего предыдущего поста.

Последний раз редактировалось Frigate, 02.01.2012 в 23:41.
Frigate вне форума  
 
Непрочитано 02.01.2012, 23:38
#20
WST


 
Регистрация: 21.04.2011
Сообщений: 135


Frigate, я прогу пробовал, вот с таким списком
("ЩО-1Гр 1" "ЩО-1Гр 2" "ЩО-1Гр 3" "ЩО-1Гр 4" "ЩО-1Гр 12" "ЩО-2Гр 1" "ЩО-2Гр 2")
все нормально но внем нету 3-его элемента
а с токим ничего не получается
(("ЩО-1Гр 1" 1.26) ("ЩО-1Гр 11" 1.26) ("ЩО-2Гр 1" 0.864) ("ЩО-1Гр 2" 1.26))
тогда дай пример списка который прога отсортирует так как мне нужно

добавил
=================================================================
Frigate, спосибо ты прав! а я тебя не понял и начил сциплять сам элементы

Последний раз редактировалось WST, 02.01.2012 в 23:59.
WST вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Сортировка списка (элементы текст) по возрастанию

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Word. Преобразование нумерованного списка в обычный текст с сохранением нумерации kp+ Прочее. Программное обеспечение 24 15.11.2021 13:20
Создание дополнительных параметров Visibility Set в динамических блоках. Supermax Программирование 708 12.04.2021 14:54
[Autocad MEP 2011 ENG] Параметрические элементы. cdholder Вертикальные решения на базе AutoCAD 23 02.04.2013 15:05
Сортировка по возрастанию и убывания из файла xopox Программирование 1 03.06.2010 16:16
Сортирвка списка последовательно, по приоритетам (вопрос) Tonic Программирование 9 02.02.2010 14:25