2011-01-05 91 views
7

我是Lisp的新手,我想学习Lisp编程。 我想在下面的表格列出了一些从一个文本文件中读取,如排序:根据一些元素排序列表

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

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

我有以下想法:

  1. 阅读它们,并把它们放到列表
  2. 遍历容器的目录列表,并与下面的一个像冒泡排序列表中的值进行比较。

是否有更合适的数据结构来实现这一点,也许像Java中的集合,其中包含自动包含排序逻辑和fullfill排序的可比对象?

非常感谢。

回答

10

标准sort函数采用:key参数,该参数可用于从对象中提取值以用作排序关键字。对于你的例子,如果你在一个列表中的文件有每个列表称为objects,下面的破坏性排序objects第一整数元素,并返回一个排序列表:

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

为常见的精确规范请参阅http://l1sp.org/cl/sort Lisp的sort功能。

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)