List 根据某些元素对列表进行排序

List 根据某些元素对列表进行排序,list,sorting,lisp,common-lisp,List,Sorting,Lisp,Common Lisp,我是Lisp的新手,我想学习Lisp编程。 我想对从文本文件读取的一些列表进行排序,如下表所示: (a 120 135 124 124) (b 120 135 124 124) (c 120 135 124 124) 根据第一个整数元素或第二个或第三个等对它们进行排序的最佳方法是什么 我有以下想法: 把它们全部读一遍,然后把它们放到一个列表中 迭代容器列表,并将列表的值与冒泡排序中的值进行比较 是否有更合适的数据结构来实现这一点,比如Java中的集合,它会自动获取包含排序逻辑和fullfill

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

(a 120 135 124 124)
(b 120 135 124 124)
(c 120 135 124 124)
根据第一个整数元素或第二个或第三个等对它们进行排序的最佳方法是什么

我有以下想法:

  • 把它们全部读一遍,然后把它们放到一个列表中
  • 迭代容器列表,并将列表的值与冒泡排序中的值进行比较 是否有更合适的数据结构来实现这一点,比如Java中的集合,它会自动获取包含排序逻辑和fullfill排序的可比较对象


    非常感谢。

    标准的
    排序
    函数采用一个
    :key
    参数,可用于从对象中提取一个值作为排序键。例如,如果文件中的每个列表都位于名为
    对象
    的列表中,则以下内容将按第一个整数元素对
    对象
    进行破坏性排序,并返回排序后的列表:

    (sort objects #'< :key #'second)
    
    (排序对象#'<:键#'秒)
    
    有关Common Lisp的
    sort
    函数的精确说明,请参见

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