根据一些元素排序列表

时间:2011-01-05 16:11:07

标签: list sorting lisp common-lisp

我是Lisp的新手,我想学习Lisp编程。 我想对从文本文件中读取的一些列表进行排序,如下面的形式:

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

根据第一个整数元素或者第二个或第三个元素对它们进行排序的最佳方法是什么?等等?

我有以下想法:

  1. 全部阅读并将它们放入列表清单
  2. 遍历容器列表,并将列表的值与冒泡排序中的后续值进行比较。
  3. 是否有更合适的数据结构来实现这一点,可能就像Java中的Collections一样,它采用包含排序逻辑和自动填充排序的可比对象?

    非常感谢。

2 个答案:

答案 0 :(得分:10)

标准sort函数采用:key参数,该参数可用于从对象中提取值以用作排序键。对于您的示例,如果您在名为objects的列表中包含文件中的每个列表,则以下内容将通过第一个整数元素对objects进行破坏性排序并返回已排序的列表:

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

有关Common Lisp的sort函数的精确说明,请参阅http://l1sp.org/cl/sort

答案 1 :(得分:1)

(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)