сортировка списков по некоторым элементам - PullRequest
7 голосов
/ 05 января 2011

Я новичок в Лиспе и хочу изучать программирование на Лиспе.Я хочу отсортировать некоторые списки, прочитанные из текстового файла, например, в следующей форме:

(a 120 135 124 124)
(b 120 135 124 124)
(c 120 135 124 124)

Каков наилучший способ сортировки их по первому целочисленному элементу или, возможно, второму или третьему и т. Д.?

У меня есть следующая идея:

  1. прочитать их все и поместить их в список списков
  2. перебрать список контейнеров и сравнить значения списка сследующий как в пузырьковой сортировке.

Существуют ли более подходящие структуры данных для достижения этой цели, например, такие как Collections in Java, которые принимают сопоставимые объекты, содержащие логику сортировки и автоматическую сортировку с полным заполнением?

Большое спасибо.

Ответы [ 2 ]

10 голосов
/ 05 января 2011

Стандартная функция sort принимает аргумент :key, который можно использовать для извлечения значения из объекта для использования в качестве ключа сортировки. Для вашего примера, если бы у вас был каждый список из файла в списке с именем objects, следующее деструктивно сортировало бы objects по первому целочисленному элементу и возвращало отсортированный список:

(sort objects #'< :key #'second)

См. http://l1sp.org/cl/sort для точной спецификации функции sort Common Lisp.

1 голос
/ 06 января 2011
(defun position-of-first-int (alist)
  (position (find-if 
             #'(lambda (x) (not (numberp x)))
             alist)
            alist))

(defun sort-from-first-int (alist)
  (sort (subseq alist (1+ (position-of-first-int alist))) #'<))

Тест:

> (setf a '(a 120 135 124 124))
> (setf b '(120 b 135 124 124))
> (setf c '(120 135 c 124 110))

> (format t "~a~%" (sort-from-first-int a))
(120 124 124 135)
> (format t "~a~%" (sort-from-first-int b))
(124 124 135)
> (format t "~a~%" (sort-from-first-int c))
(110 124)
...