首页 > 解决方案 > 如何在lisp中对列表进行排序?

问题描述

我在 lisp 中有一个这样的列表:

(
    ((5 6) (2 7)) 
    ((5 4) (2 9)) 
    ((1 8) (7 7))
)

我想按所有这些条件对其进行排序:

  1. 仅通过第一个元素:(5 6), (5 4),(1 8)

  2. 在这些元素中,首先按 x 排序,然后按 y 排序:(1 8) (5 4) (5 6)

最后,我希望在第一个元素中有一个按上述条件排序的列表,并且每个元素都有它们的第二个元素:

(
    ((1 8) (7 7)) 
    ((5 4) (2 9))
    ((5 6) (2 7)) 
)

你能给我一个子程序来做到这一点,好吗?

谢谢你。

标签: listsortinglispautocadautolisp

解决方案


由于您在评论中声明您正在使用 Visual LISP,因此您可以通过vl-sort以下方式使用标准函数(实现快速排序算法):

(setq l
  '(
       ((5 6) (2 7)) 
       ((5 4) (2 9)) 
       ((1 8) (7 7))
    )
)
(vl-sort l
   '(lambda ( a b )
        (if (= (caar  a) (caar  b))
            (< (cadar a) (cadar b))
            (< (caar  a) (caar  b))
        )
    )
)

在这里,iflambda 比较函数中的语句测试每个项目的第一个子列表的第一个元素(“x 坐标”)是否相等,如果相等,则比较第二个元素(“y 坐标”)。

对于lambda函数中给定的一对项目:

a = ((5 6) (2 7))

(car a)   = (5 6)
(caar a)  = 5
(cadar a) = 6

推荐阅读