[原创]精典排序函数:能根据X、Y条件对坐标表进行各种排序!(源代码哟)
能进行坐标点的排序!你是想进行先X从上到下后Y从左到右
或是先X从下到上后Y从右到左
或是。。。。。。。。。。。。。。。
哈哈。。。。
通吃!!!!!
我吃。。。
我吃。。。。。。。。。。。。。。
。。。。。。。。。。。。。
---------------------------------------------------------------------------------
该函数是根据《明经通道》上的函数库中领悟而得
在此向明经通道致谢!!!!!!!!!!文字 我才从“隔壁”过来,看到过此文。 不只怎么,从表中取出的<、>函数不能使用。
我也做了一个,增加两个功能,单独给x、y排序。
fun参数如下:
(0 < <)单独给X排序
(1 < <)单独给Y排序
(2 < <)先X后Y
(3 < <)先Y后X
(defun sort(lst fun / a)
(defun des(e1 e2)
(if (= (cadr fun) '<)
(< (car e1) (car e2))
(> (car e1) (car e2))
)
)
(defun des2(e1 e2)
(if (= (caddr fun) '<)
(< (cadr e1) (cadr e2))
(> (cadr e1) (cadr e2))
)
)
(cond
((= (car fun) 0) (vl-sort lst 'des))
((= (car fun) 1) (vl-sort lst 'des2))
((= (car fun) 2) (setq a (vl-sort lst 'des)) (vl-sort a 'des2))
((= (car fun) 3) (setq a (vl-sort lst 'des2)) (vl-sort a 'des))
)
)
本帖最后由 作者 于 2003-8-15 17:31:07 编辑
这样就可以了
(defun sort(lst fun / a)
(defun des(e1 e2)
((eval (cadr fun)) (car e1) (car e2))
)
(defun des2(e1 e2)
((eval (caddr fun)) (cadr e1) (cadr e2))
)
(cond
((= (car fun) 0) (vl-sort lst 'des))
((= (car fun) 1) (vl-sort lst 'des2))
((= (car fun) 2) (setq a (vl-sort lst 'des)) (vl-sort a 'des2))
((= (car fun) 3) (setq a (vl-sort lst 'des2)) (vl-sort a 'des))
)
)
(defun sort-xy(li no / s-x s-y)
(defun s-x (li )(vl-sort li '(lambda(x y)(< (car x)(car y)))))
(defun s-y (li )(vl-sort li '(lambda(x y)(< (cadr x)(cadr y)))))
(cond((= no 0)(s-x li) )
((= no 1)(s-y li ) )
((= no 2) (s-x(s-y li)))
((= no 3)(s-y(s-x li)))
)
)
(sort-xy ptn 0) ...
其实不好,应该下面更好
(defun sort-xy (li how / a)
(if(setq a(car how))(setq li(vl-sort li '(lambda(x y)((eval a)(car x)(car y))))))
(if(setq a(cadr how))(setq li(vl-sort li '(lambda(x y)((eval a)(cadr x)(cadr y))))))
li
)
(sort-xy li '(< >))x:< y: >
(sort-xy li '(>)) x:>
(sort-xy li '(nil >)) y:>
(sort-xy li '(> >) ...... 调用:(NetBee_px slist (list 1 < >)) 调用:(NetBee_px slist (list 1 < >))
其中slist:((x y)(x y)(x y).........)
后面一个条件表,只能用list生成 aeo000000发表于2003-8-15 23:59:00static/image/common/back.gif(defun sort-xy(li no / s-x s-y) (defun s-x (li )(vl-sort li '(lambda(x y)(< (car x)(car y))))) (defun s-y (li )(vl-sort li '(lambda(x y)(<...
其实,有一个概念我想跟大家说一下。前几次看到类似帖子的时候就想说了,但有次回复不成功,后来就算了。这回不知道正不正常,要是不能发,也就再不说了。
什么是对多维数组排序? 什么是先x,后y?这些和按x 或按y排序有何区别?看这个贴的朋友们你们自己都清楚么?
先看看 <A name=37378><FONT color=#000066><B>meflying</B></FONT></A> 和aeo的例子
(setq lst '((0 1 0)(1 0 0)(0 1 1)(0 1 2)(1 0 1)(2 0 1)(0 2 2)))<BR>(sort-xy lst '(nil <)) 返回:((1 0 0) (1 0 1) (2 0 1) (0 1 0) (0 1 1) (0 1 2) (0 2 2))
(sort-xy lst '(< <)) 返回:((1 0 0) (1 0 1) (2 0 1) (0 1 0) (0 1 1) (0 1 2) (0 2 2))
(sort lst '(2 < <));先X后Y ->返回:((1 0 0) (1 0 1) (2 0 1) (0 1 0) (0 1 1) (0 1 2) (0 2 2))
(sort lst '(1 < <));单独给Y排序 ->返回:((1 0 0) (1 0 1) (2 0 1) (0 1 0) (0 1 1) (0 1 2) (0 2 2))
不知道大家看明白没有:)
根本没有什么先x后y,或先y后x排序。先x后y的效果和按y排序是一样的,先y后x同理!返回结果都是按照fun中定义的表的最后一种方式排序,因此,先什么后什么的说法或那部分程序语句是多余的,一个美丽的光环而已。
什么是真正的先x后y排序?
那就是:多维数组中先按x排序,在x数值***相同***的元素中,再按照y排序。
好了,概念清楚了。程序也将呼之欲出了吧? :)<BR> 本帖最后由 作者 于 2004-4-2 23:37:33 编辑
实在看不明白楼上说的到底是要说明什么问题,
如下图,假设列表是这个各自各交点的一个表,如果仅按Y排(从小到大),则结果可能会是:(3 1 2 4 6 5 7 8 9),而如果先按X排,再按Y排,则将得到(1 2 3 4 5 6 7 8 9)——用数字表示此处的点坐标。
你说的“多维数组中先按x排序,在x数值***相同***的元素中,再按照y排序”,则跟先按Y排,再按X排,结果是一样的...而同先X,再Y则不是一回事