明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2921|回复: 19

数字后缀的字符串. 只按X排序

  [复制链接]
发表于 2012-10-5 00:08:58 | 显示全部楼层 |阅读模式
     搜到大师的帖子,如下:
   ;;;(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))  这样的




 楼主| 发表于 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 i  0
          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")
 楼主| 发表于 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))


 楼主| 发表于 2012-10-6 00:33:32 | 显示全部楼层
   就是X,Y坐标点对按X排序的升级版
发表于 2012-10-6 10:29:22 | 显示全部楼层
方法都给你了,
 楼主| 发表于 2012-10-6 23:39:15 | 显示全部楼层
本帖最后由 xjf 于 2012-10-6 23:45 编辑

  前辈能否帮改一个,谢谢你了
对lambda 和
  mapcar这两个 函数总是理解不透  
 楼主| 发表于 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系列的排序,我觉得这个算法不好,帮你顶一下吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-2-27 16:41 , Processed in 0.369865 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表