【问题标题】:sorting lists according to some elements根据某些元素对列表进行排序
【发布时间】:2011-01-05 16:11:06
【问题描述】:

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

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

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

我有以下想法:

  1. 全部阅读并将它们放入列表列表中
  2. 遍历容器列表并将列表的值与冒泡排序中的后续值进行比较。

是否有更合适的数据结构来实现这一点,比如 Java 中的 Collections,它采用包含排序逻辑和自动填充排序的可比较对象?

非常感谢。

【问题讨论】:

    标签: list sorting lisp common-lisp


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:
      (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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-13
        • 1970-01-01
        • 2018-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多