数字后缀的字符串. 只按X排序
搜到大师的帖子,如下:;;;(strsort strlst) = 含数字后缀的字符串排序-无痕.2004.6 ok!
(defun strsort (strlst)
(defun strbrk (str / i st1 n)
(setq i 0)
(while (not (or (= "" (setq st1 (substr str (setq i (1+ i)))))
(setq n (distof st1))
)
)
)
(list (substr str 1 (1- i))
(if n n 0)
str
)
)
(defun x-sort (lst do n)
(vl-sort lst
'(lambda (x y) ((eval do) (nth n x) (nth n y)))
)
)
(mapcar 'last
(x-sort (mapcar 'strbrk strlst) '< 1) ;;针对你的情况调整
)
)
但请请问大师,带数字后缀的字符串. 只按X的大小排序怎么写啊?
如("A-12" (图元名: qqaaa)) ("A-2" (图元名: qqaaa))这样的
因要用到此类函数按编号来提取物体的数据 ;;专用字符排序,效果比vl-sort好用
(defun TBC:Sort (lst func / Split CompFunc tmp)
(defun Split (str / tmp i n p x len lst1 lst)
(setq tmp(vl-string->list str)
lst1 (mapcar '(lambda (x) (and (<= 48 x) (<= x 57))) tmp)
n (length lst1)
i 0
)
(while (< i n)
(setq x (nth i lst1)
i (1+ i)
)
(if (= i 1)
(setq p 1
len 1
) ;else
(if (= x (nth (- i 2) lst1))
(setq len (1+ len)) ;else
(setq tmp (substr str p len)
tmp (if x
tmp
(atoi tmp)
)
lst (append lst (list tmp))
p i
len 1
)
) ;if
) ;if
) ;while
(if (> n 0)
(setq tmp (substr str p len)
tmp (if x
(atoi tmp)
tmp
)
lst (append lst (list tmp))
)
)
lst
)
(defun CompFunc (lst1 lst2 / tmp do flag i n el1 el2 typ1 typ2)
(setq i0
n(min (length lst1) (length lst2))
do T
)
(while (and do (<= i n))
(setq el1 (nth i lst1)
typ1 (type el1)
el2 (nth i lst2)
typ2 (type el2)
i (1+ i)
)
(if (= typ1 typ2)
(setq do (= el1 el2)
flag (eval (list func el1 el2))
) ;else
(setq do nil
flag (or (= typ1 'nil) (= typ2 'STR))
)
) ;if
) ;while
flag
)
(setq tmp (mapcar 'Split lst)
tmp (vl-sort-i tmp 'CompFunc)
tmp (mapcar '(lambda (x) (nth x lst)) tmp)
)
tmp
)
;;(TBC:SORT '("A-12" "B-25" "A-20" "C-3" "A-0") '>)
;; ("C-3" "B-25" "A-20" "A-12" "A-0") 本帖最后由 xjf 于 2012-10-6 00:30 编辑
大侠,我现在要只排点对中的X序,,请赐教
带数字后缀的字符串. 只按X的大小排序怎么写啊?
如("D-12" (图元名: qqaaa)) ("A-2" (图元名: qqaaa)("F-2" (图元名: qqaaa)) 这样的
最终效果要是这样:
("A-2" (图元名: qqaaa)) ("D-12" (图元名: qqaaa)("F-2" (图元名: qqaaa))
就是X,Y坐标点对按X排序的升级版 方法都给你了, 本帖最后由 xjf 于 2012-10-6 23:45 编辑
前辈能否帮改一个,谢谢你了
对lambda 和
mapcar这两个 函数总是理解不透 本帖最后由 xjf 于 2012-10-7 16:48 编辑
做了一个:好像不行的
lix= (("PU-3" (-1 . <图元名: -3d60d8>)) ("PU-20" (-1 . <图元名: -3d6148>)) ("DIE-9" (-1 . <图元名: -38b4d0>)) ("PU-25" (-1 . <图元名: -3d5fb8>)))
(setq LST_POX '())
(foreach x lix
(setq LST_POX (cons (list(car x)(cadr x)) LST_POX))
)
(setq LST_X(TBC:SORT LST_POX
(function (lambda (e1 e2)
( (car e1) (car e2)) ) ) <)
)
(reverse LST_POX)
首先说明一下,以下代码并不能完成,因为TBC:sort我用的不熟,而VL-sort对字符串的排序不问题
(setq lst1 (list "PU-3" "PU-20" "DIE-9" "PU-25"))
(setq ss (ssget))
(setq i 0
sslst '()
)
(repeat (sslength ss)
(setq endata (entget (ssname ss i)))
(setq zhi (assoc -1 endata))
(setq sslst (cons zhi sslst))
(setq i (1+ i))
)
(setq endlst (mapcar '(lambda (x y)
(list x y)
)
lst1
sslst
)
)
;;;(setq endlst '(("PU-3" (-1 . <图元名: 7ef7e810>))
;;; ("PU-20" (-1 . <图元名: 7ef7e818>))
;;; ("DIE-9" (-1 . <图元名: 7ef7e820>))
;;; ("PU-25" (-1 . <图元名: 7ef7e828>))
;;; )
;;;)
;;;(vl-sort '((3 5) (2 2) (4 3))
;;;
;;; (function (lambda (e1 e2)
;;;
;;; (< (cadr e1) (cadr e2))
;;; )
;;; )
;;;)
;;;((2 2) (4 3) (3 5))
(setq endlst (vl-sort endlst
(function (lambda
(e1 e2)
(< (car e1) (car e2))
)
)
)
) 我知道我的算法不好,如果继续往下写的话我会将同一组的进行排序,比如说单独对PU系列的排序,我觉得这个算法不好,帮你顶一下吧
页:
[1]
2