list - 如何在lisp中对列表进行排序?
问题描述
我在 lisp 中有一个这样的列表:
(
((5 6) (2 7))
((5 4) (2 9))
((1 8) (7 7))
)
我想按所有这些条件对其进行排序:
仅通过第一个元素:
(5 6)
,(5 4)
,(1 8)
在这些元素中,首先按 x 排序,然后按 y 排序:
(1 8)
(5 4)
(5 6)
最后,我希望在第一个元素中有一个按上述条件排序的列表,并且每个元素都有它们的第二个元素:
(
((1 8) (7 7))
((5 4) (2 9))
((5 6) (2 7))
)
你能给我一个子程序来做到这一点,好吗?
谢谢你。
解决方案
由于您在评论中声明您正在使用 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))
)
)
)
在这里,if
lambda 比较函数中的语句测试每个项目的第一个子列表的第一个元素(“x 坐标”)是否相等,如果相等,则比较第二个元素(“y 坐标”)。
对于lambda
函数中给定的一对项目:
a = ((5 6) (2 7))
(car a) = (5 6)
(caar a) = 5
(cadar a) = 6
推荐阅读
- solr - Solr 突出显示以包括搜索返回的连字符结果
- c++ - 为未初始化的 std::string 变量分配了多少内存?
- c++ - 为什么编译器不能使用默认参数为这个模板化函数扣除比较?
- oracle - plpgsql 返回具有多行的复合类型。使用 select 语句作为函数的 IN 参数
- java - java中的基本Http服务器PUT请求
- javascript - 如何使用 addEventListener 更改 div 的颜色
- r - 如何在 Shiny 的渲染 UI 中渲染复选框?
- c++ - 从 boost::time_duration 检索微秒
- amazon-web-services - 当 AWS API Gateway 事件中的请求中没有源标头时,这意味着什么?
- c# - 一个进程无法访问文件,因为它正被另一个进程使用