LONGXIN 发表于 2005-6-15 00:09:00

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

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



使用格式:


;;;测试程序<BR>(defun c:test (/ coord tt)<BR>       (setq        coord<BR>       '(<BR>                       (1 (1 . 2) 3 ("kkj" 4) (3 0))<BR>                       (1 (1 . 4) 1 ("skj" 45) (2 3))<BR>                       (1 (1 . 2) 3 ("Aej" 45) (7 1))<BR>                       (1 (2 . 3) 2 ("ser" 4) (9 2))<BR>                       (2 (6 . 2) 2 ("Serj" 9) (1 4))<BR>                       (3 (3 . 5) 1 ("kkjsd" 35) (7 6))<BR>                       (2 (4 . 7) 2 ("Akjdd" 3) (5 4))<BR>                       (3 (3 . 3) 3 ("sekj" 446) (3 4))<BR>                       (2 (2 . 2) 2 ("serj" 9) (1 4))<BR>                       (1 (8 . 2) 2 ("wggj" 46) (2 4))<BR>                       (1 (1 . 4) 1 ("kkj" 9) (4 4))<BR>                       (3 (3 . 3) 3 ("sekj" 446) (3 4))<BR>                       (1 (8 . 2) 2 ("wggj" 46) (2 4))<BR>               )<BR>       )<BR>       <BR>;;表第一项为要排序的依据,注意后面的括号没有,第二项即为后括号的个数,第三项为按升还是降排序<BR>       (setq        tt '(("(nth 0 (nth 3 " 2 "&gt;")<BR>                                       ("(nth 0" 1 "&lt;")<BR>                                       ("(car (nth 1 " 2 "&lt;")<BR>                                       ("(nth 1 (nth 4 " 2 "&gt;")<BR>                                       ("(nth 1 (nth 3" 2 "&gt;")<BR>                               )<BR>       )


       (order coord tt)<BR>)


xiaojiajun160 发表于 2021-11-8 18:14:59

支持源码!!犀利啊!

yk1216 发表于 2024-8-30 23:08:56

谢谢分享学习

无痕 发表于 2005-6-15 21:00:00

我看这意思怎么好像对要排序的表也有规定?


这如何起到通用的作用呢?

LONGXIN 发表于 2005-6-15 22:22:00

tt的参数是根据表的变化而变化的,无痕兄可以给出一个表来,说明排序的方法,我用此函数排序出来

spring 发表于 2005-6-16 22:13:00

没看懂,和 vl-sort       函数有不同吗(我没有试 :)       )

LONGXIN 发表于 2005-6-16 23:53:00

spring兄你可以试着给一个表出来,我用它来按你的要求排序

LONGXIN 发表于 2005-6-17 00:17:00

举一个简单的坐标表排序:


(defun c:test (/ coord tt)<BR>       (setq        coord<BR>       '(<BR>                       (1 2 3)<BR>                       (1        5 6)<BR>                       (4 2 3)<BR>                       (3        1 6)<BR>                       (4 2 3)<BR>       )<BR>       <BR>;;第一项为要排序的依据,注意后面的括号没有,第二项即为后括号的个数,第三项为按升还是降排序


;先按x升序,再按y升序,最后按z升序<BR>       (setq        tt '(       ( "(nth 0"               1               "&lt;");表示按x升序<BR>                                                                                                                                       ( "(nth 1"               1               "&lt;");表示按y升序<BR>                                                                                                                                                ( "(nth        2"               1               "&lt;");表示按z升序<BR>                                                                                                               )<BR>                                               )


       (order coord tt)<BR>)

meflying 发表于 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))))

LONGXIN 发表于 2005-6-17 10:20:00

其实我也是用vl-sort-i对表进行排序,只是利用进口参数tt让程序自动生成


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


中的条件。因为当表比较复杂,排序的项比较多时这个条件还是不太好写的。


比如6楼的那个先x排序再按y排序,最后按z排序,利用tt最后是生成了这样子一个条件表达式:


(setq tj '(cond<BR>       ((&lt; (nth 0 p1) (nth 0 p2)) T)<BR>       ((and<BR>       (= (nth 0 p1) (nth 0 p2))<BR>       (&lt; (nth        1 p1) (nth        1 p2))<BR>       )<BR>       T<BR>       )<BR>       ((and<BR>       (= (nth 0 p1) (nth 0 p2))<BR>       (= (nth        1 p1) (nth        1 p2))<BR>       (&lt; (nth        2 p1) (nth        2 p2))<BR>       )<BR>       T<BR>       )<BR>       (T nil)<BR>       ))


再用(setq                       coord_i<BR>                                    (vl-sort-i        coord_list<BR>                      (function (lambda (p1 p2)<BR>                                                        (eval       tj)<BR>                                          )<BR>                      )                               


            )<BR>         )


进行实际排序

dkj0322 发表于 2010-10-12 12:44:00

<p><font face="Verdana">谢谢楼上各位兄弟的提供与讲解,参考下,很感激!</font></p>

zwqgdhl 发表于 2011-7-12 13:22:13

路过顶一个,支持源码,以后我自己也要多发好的源码,大家共同学习进步
页: [1] 2
查看完整版本: [原创]真正万能的通用排序函数,对任何类型的表都适用