lisp爱好者 发表于 2013-9-2 14:22:58

求助表按坐标点排序

各位大师:
   请教下:一个lst表中有n个类似((0 0 0) 2 5)的小表,小表内(0 0 0) 为坐标点,后面两个数可以不管,只按坐标点排序
(setq lst '(((250 120 0)2 5)((0 120 0)2 5)((0 0 0) 2 5)((250 0 0)2 5)((125 0 0)2 5)((125 120 0)2 5)));赋值lst表
如何排序成从左到右,从下到上的表: '(((0 0 0) 2 5)((125 0 0)2 5)((250 0 0)2 5)((0 120 0)2 5)((125 120 0)2 5))((250 120 0)2 5))

lisp爱好者 发表于 2013-9-2 14:24:59

小表((0 0 0) 2 5)中后面数字2和5是由变量赋值的,请求大家帮忙,谢谢

lisp爱好者 发表于 2013-9-2 14:50:25

试出来了,大家有没有更好的方法?烦请赐教(setq lst1(vl-sort lst
      '(lambda (x y)
         (if (equal (caar x) (caar y) 10)
         (< (cadar x) (cadar y))
         (< (caar x) (caar y))
         )
       )
   )
)

lisp爱好者 发表于 2013-9-2 15:28:24

没细看,结果错误,大侠们人呢。

lisp爱好者 发表于 2013-9-2 16:40:32

明白了,还差一个步续,再排一次

ll_j 发表于 2013-9-2 17:05:15

(defun tt (lst);主程序
(setq lst (sort lst < cadar))
(sort2 lst)
)

(defun sort (lst fun n);一级排序
(vl-sort lst '(lambda (x y) (fun (n x) (n y))))
)

(defun sort2 (lst)    ;二级排序
(if lst
    (append
      (apply 'list
             (sort
               (vl-remove-if-not
               '(lambda (x) (= (cadar x) (cadaar lst)))
               lst
               )
               <
               caar
             )
      )
      (sort2
      (vl-remove-if '(lambda (x) (= (cadar x) (cadaar lst))) lst)
      )
    )
)
)

ll_j 发表于 2013-9-2 17:12:11

lisp爱好者 发表于 2013-9-2 14:50 static/image/common/back.gif
试出来了,大家有没有更好的方法?烦请赐教

(setq lst1 (vl-sort lst
                  '(lambda (x y)
                     (if (equal (cadar x) (cadar y) 10)
                         (< (caar x) (caar y))
                         (< (cadar x) (cadar y))
                     )
                     )
         )
)
楼主的还是很巧妙的,我的自己绕自己了。
页: [1]
查看完整版本: 求助表按坐标点排序