明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3701|回复: 17

[原创]真正万能的通用排序函数,对任何类型的表都适用

  [复制链接]
发表于 2005-6-15 00:09:00 | 显示全部楼层 |阅读模式
[原创]真正万能的通用排序函数,对任何类型的表都适用 使用格式: ;;;测试程序
(defun c:test (/ coord tt)
(setq coord
'(
(1 (1 . 2) 3 ("kkj" 4) (3 0))
(1 (1 . 4) 1 ("skj" 45) (2 3))
(1 (1 . 2) 3 ("Aej" 45) (7 1))
(1 (2 . 3) 2 ("ser" 4) (9 2))
(2 (6 . 2) 2 ("Serj" 9) (1 4))
(3 (3 . 5) 1 ("kkjsd" 35) (7 6))
(2 (4 . 7) 2 ("Akjdd" 3) (5 4))
(3 (3 . 3) 3 ("sekj" 446) (3 4))
(2 (2 . 2) 2 ("serj" 9) (1 4))
(1 (8 . 2) 2 ("wggj" 46) (2 4))
(1 (1 . 4) 1 ("kkj" 9) (4 4))
(3 (3 . 3) 3 ("sekj" 446) (3 4))
(1 (8 . 2) 2 ("wggj" 46) (2 4))
)
)

;;表第一项为要排序的依据,注意后面的括号没有,第二项即为后括号的个数,第三项为按升还是降排序
(setq tt '(("(nth 0 (nth 3 " 2 ">")
("(nth 0" 1 "<")
("(car (nth 1 " 2 "<")
("(nth 1 (nth 4 " 2 ">")
("(nth 1 (nth 3" 2 ">")
)
) (order coord tt)
)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2021-11-8 18:14:59 | 显示全部楼层
支持源码!!犀利啊!
发表于 2024-8-30 23:08:56 | 显示全部楼层
谢谢分享学习
发表于 2005-6-15 21:00:00 | 显示全部楼层
我看这意思怎么好像对要排序的表也有规定?


这如何起到通用的作用呢?
 楼主| 发表于 2005-6-15 22:22:00 | 显示全部楼层
tt的参数是根据表的变化而变化的,无痕兄可以给出一个表来,说明排序的方法,我用此函数排序出来
发表于 2005-6-16 22:13:00 | 显示全部楼层
没看懂,和 vl-sort         函数有不同吗(我没有试 :)         )
 楼主| 发表于 2005-6-16 23:53:00 | 显示全部楼层
spring兄你可以试着给一个表出来,我用它来按你的要求排序
 楼主| 发表于 2005-6-17 00:17:00 | 显示全部楼层
举一个简单的坐标表排序: (defun c:test (/ coord tt)
(setq coord
'(
(1 2 3)
(1 5 6)
(4 2 3)
(3 1 6)
(4 2 3)
)

;;第一项为要排序的依据,注意后面的括号没有,第二项即为后括号的个数,第三项为按升还是降排序 ;先按x升序,再按y升序,最后按z升序
(setq tt '( ( "(nth 0" 1 "<");表示按x升序
( "(nth 1" 1 "<");表示按y升序
( "(nth 2" 1 "<");表示按z升序
)
) (order coord tt)
)
发表于 2005-6-17 09:43:00 | 显示全部楼层
你应该举一个比VL-SORT更有优势的例子,上面这个排序,用VL-SORT就很简单


(setq coord (vl-sort coord '(lambda(e1 e2) (&lt; (car e1) (car e2)))))


(setq coord (vl-sort coord '(lambda(e1 e2) (&lt; (cadr e1) (cadr e2)))))


(vl-sort coord '(lambda(e1 e2) (&lt; (caddr e1) (caddr e2))))
 楼主| 发表于 2005-6-17 10:20:00 | 显示全部楼层
其实我也是用vl-sort-i对表进行排序,只是利用进口参数tt让程序自动生成 (vl-sort coord '(lambda(e1 e2) [I](< (caddr e1) (caddr e2))[/I])) 中的条件。因为当表比较复杂,排序的项比较多时这个条件还是不太好写的。 比如6楼的那个先x排序再按y排序,最后按z排序,利用tt最后是生成了这样子一个条件表达式: (setq tj '(cond
((< (nth 0 p1) (nth 0 p2)) T)
((and
(= (nth 0 p1) (nth 0 p2))
(< (nth 1 p1) (nth 1 p2))
)
T
)
((and
(= (nth 0 p1) (nth 0 p2))
(= (nth 1 p1) (nth 1 p2))
(< (nth 2 p1) (nth 2 p2))
)
T
)
(T nil)
)) 再用(setq coord_i
    (vl-sort-i coord_list
       (function (lambda (p1 p2)
         (eval tj)
          )
        )      )
   ) 进行实际排序
发表于 2010-10-12 12:44:00 | 显示全部楼层

谢谢楼上各位兄弟的提供与讲解,参考下,很感激!

发表于 2011-7-12 13:22:13 | 显示全部楼层
路过顶一个,支持源码,以后我自己也要多发好的源码,大家共同学习进步
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-9-23 20:17 , Processed in 0.432004 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表