xjf 发表于 2012-10-5 00:08:58

数字后缀的字符串. 只按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))这样的



xjf 发表于 2012-10-5 00:10:52

因要用到此类函数按编号来提取物体的数据

革天明 发表于 2012-10-5 16:34:36

;;专用字符排序,效果比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:24:41

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


xjf 发表于 2012-10-6 00:33:32

   就是X,Y坐标点对按X排序的升级版

革天明 发表于 2012-10-6 10:29:22

方法都给你了,

xjf 发表于 2012-10-6 23:39:15

本帖最后由 xjf 于 2012-10-6 23:45 编辑

前辈能否帮改一个,谢谢你了
对lambda 和
mapcar这两个 函数总是理解不透

xjf 发表于 2012-10-7 16:47:26

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

革天明 发表于 2012-10-9 10:20:21

首先说明一下,以下代码并不能完成,因为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))
                               )
                     )
             )
)

革天明 发表于 2012-10-9 10:21:36

我知道我的算法不好,如果继续往下写的话我会将同一组的进行排序,比如说单独对PU系列的排序,我觉得这个算法不好,帮你顶一下吧
页: [1] 2
查看完整版本: 数字后缀的字符串. 只按X排序