[原创]真正万能的通用排序函数,对任何类型的表都适用
[原创]真正万能的通用排序函数,对任何类型的表都适用使用格式:
;;;测试程序<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 ">")<BR> ("(nth 0" 1 "<")<BR> ("(car (nth 1 " 2 "<")<BR> ("(nth 1 (nth 4 " 2 ">")<BR> ("(nth 1 (nth 3" 2 ">")<BR> )<BR> )
(order coord tt)<BR>)
支持源码!!犀利啊! 谢谢分享学习 我看这意思怎么好像对要排序的表也有规定?
这如何起到通用的作用呢? tt的参数是根据表的变化而变化的,无痕兄可以给出一个表来,说明排序的方法,我用此函数排序出来 没看懂,和 vl-sort 函数有不同吗(我没有试 :) ) spring兄你可以试着给一个表出来,我用它来按你的要求排序 举一个简单的坐标表排序:
(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 "<");表示按x升序<BR> ( "(nth 1" 1 "<");表示按y升序<BR> ( "(nth 2" 1 "<");表示按z升序<BR> )<BR> )
(order coord tt)<BR>) 你应该举一个比VL-SORT更有优势的例子,上面这个排序,用VL-SORT就很简单
(setq coord (vl-sort coord '(lambda(e1 e2) (< (car e1) (car e2)))))
(setq coord (vl-sort coord '(lambda(e1 e2) (< (cadr e1) (cadr e2)))))
(vl-sort coord '(lambda(e1 e2) (< (caddr e1) (caddr e2)))) 其实我也是用vl-sort-i对表进行排序,只是利用进口参数tt让程序自动生成
(vl-sort coord '(lambda(e1 e2) (< (caddr e1) (caddr e2))))
中的条件。因为当表比较复杂,排序的项比较多时这个条件还是不太好写的。
比如6楼的那个先x排序再按y排序,最后按z排序,利用tt最后是生成了这样子一个条件表达式:
(setq tj '(cond<BR> ((< (nth 0 p1) (nth 0 p2)) T)<BR> ((and<BR> (= (nth 0 p1) (nth 0 p2))<BR> (< (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> (< (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> )
进行实际排序 <p><font face="Verdana">谢谢楼上各位兄弟的提供与讲解,参考下,很感激!</font></p> 路过顶一个,支持源码,以后我自己也要多发好的源码,大家共同学习进步
页:
[1]
2