NetBee 发表于 2003-8-15 13:46:00

[原创]精典排序函数:能根据X、Y条件对坐标表进行各种排序!(源代码哟)

能进行坐标点的排序!
你是想进行先X从上到下后Y从左到右
或是先X从下到上后Y从右到左
或是。。。。。。。。。。。。。。。
哈哈。。。。
通吃!!!!!
我吃。。。
我吃。。。。。。。。。。。。。。
。。。。。。。。。。。。。


---------------------------------------------------------------------------------
该函数是根据《明经通道》上的函数库中领悟而得
在此向明经通道致谢!!!!!!!!!!文字

NetBee 发表于 2003-8-15 13:48:00

xazhji 发表于 2003-8-15 14:09:00

我才从“隔壁”过来,看到过此文。

meflying 发表于 2003-8-15 15:40:00

不只怎么,从表中取出的<、>函数不能使用。
我也做了一个,增加两个功能,单独给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))
)
)

meflying 发表于 2003-8-15 15:55:00

本帖最后由 作者 于 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))
)
)

aeo000000 发表于 2003-8-15 23:59:00


(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 发表于 2003-8-18 15:08:00

调用:(NetBee_px slist (list 1 < >))

NetBee 发表于 2003-8-18 15:13:00

调用:(NetBee_px slist (list 1 < >))
其中slist:((x y)(x y)(x y).........)
后面一个条件表,只能用list生成

无痕 发表于 2004-4-2 22:38:00

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)(&lt;        (car        x)(car        y)))))        (defun        s-y        (li        )(vl-sort        li        '(lambda(x        y)(&lt;...

其实,有一个概念我想跟大家说一下。前几次看到类似帖子的时候就想说了,但有次回复不成功,后来就算了。这回不知道正不正常,要是不能发,也就再不说了。



什么是对多维数组排序? 什么是先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 &lt;))       返回:((1 0 0) (1 0 1) (2 0 1) (0 1 0) (0 1 1) (0 1 2) (0 2 2))


(sort-xy lst '(&lt; &lt;))       返回:((1 0 0) (1 0 1) (2 0 1) (0 1 0) (0 1 1) (0 1 2) (0 2 2))


(sort lst '(2 &lt; &lt;));先X后Y -&gt;返回:((1 0 0) (1 0 1) (2 0 1) (0 1 0) (0 1 1) (0 1 2) (0 2 2))


(sort lst '(1 &lt; &lt;));单独给Y排序 -&gt;返回:((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>

meflying 发表于 2004-4-2 23:16:00

本帖最后由 作者 于 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则不是一回事




页: [1] 2 3 4
查看完整版本: [原创]精典排序函数:能根据X、Y条件对坐标表进行各种排序!(源代码哟)