我是Lisp的新手,我想学习Lisp编程。 我想对从文本文件中读取的一些列表进行排序,如下面的形式:
(a 120 135 124 124)
(b 120 135 124 124)
(c 120 135 124 124)
根据第一个整数元素或者第二个或第三个元素对它们进行排序的最佳方法是什么?等等?
我有以下想法:
是否有更合适的数据结构来实现这一点,可能就像Java中的Collections一样,它采用包含排序逻辑和自动填充排序的可比对象?
非常感谢。
答案 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)