ld_117 发表于 2015-1-27 09:42:54

分享自己编的编号字符串排序函数

本帖最后由 ld_117 于 2015-1-27 10:51 编辑


分享自己编的编号字符串排序函数,本人只求实现功能,不求深入学习lisp,所以函数写的比较冗长,仅作参考....
(orderLst (lst keyW))
功能:对lst根据关键字进行排序并列出相同元素的个数
参数:lst 字符串数列keyW 关键字字符串
例:(orderLst '("KL5" "KL2(2)" "KL1a(2)" "KL2(2)" "KL1(1)") "KL")
      返回(("KL1(1)" . 1) ("KL1a(2)" . 1) ("KL2(2)" . 2) ("KL5" . 1))
作者:Ld_117


(vl-load-com)      ;将 Visual LISP 扩展功能加载到 AutoLISP
;---------正则表达式设置---------
(setq reg (vlax-create-object "vbscript.regexp"))   ;创建正则表达式
(vlax-put-property reg 'global -1)                  ;是否匹配全部 (-1是 ,0 不是)
(vlax-put-property reg 'Multiline -1)               ;是否多行匹配 (-1是 ,0 不是)
(vlax-put-property reg 'IgnoreCase -1)            ;是否忽略大小写 (-1是 ,0 不是)
;---------正则表达式设置结束---------
;;排序函数开始
;;(orderLst (lst keyW))
;;功能:对lst根据关键字进行排序并列出相同元素的个数
;;参数:lst 字符串数列keyW 关键字字符串
;;例:(orderLst '("KL5" "KL2(2)" "KL1a(2)" "KL2(2)" "KL1(1)") "KL")
;;      返回(("KL1(1)" . 1) ("KL1a(2)" . 1) ("KL2(2)" . 2) ("KL5" . 1))
;;作者:Ld_117
(defun orderLst (lst keyW / x nLst len i lLst tnLst nowLst nnLst)
(setq nLst '() tnLst '())
(foreach x lst
    (setq nLst (cons (cons x (getNum x keyW)) nLst));将lst做成点对形式
)
;获得排序后的列表
(foreach x (sortLst (reverse nLst))
    (setq tnLst (append tnLst (list (car x))))
)
(setq
    nLst tnLst
    len (vl-list-length nLst)
    i 0
    nowLst '()
    nNowLst '()
    nnLst '()
)
;合并tnLst中相同元素并统计数量
(while (< i len)
    (if (setq nowLst (assoc (nth i nLst) nnLst))
      (progn
      (setq nNowLst (cons (car nowLst) (1+ (cdr nowLst))))
      (setq nnLst (subst nNowLst nowLst nnLst))
      )
      (setq nnLst (cons (cons (nth i nLst) 1) nnLst))
    )
    (setq i (1+ i))
)
(setq nnLst (reverse nnLst))
)
;;(getNum (str keyW))
;;功能:获得str中紧跟keyW的编号字符,编号可以包含数字及字母
;;参数:str 字符串keyW 关键字字符串
;;例:(getNum "KL5a(2)" "KL")
;;      返回"5a"
;;作者:Ld_117
(defun getNum (str keyW / matchcollect)
(vlax-put-property reg 'pattern (strcat "^" keyW))
(setq str (vlax-invoke-method reg 'Replace str ""))
(vlax-put-property reg 'pattern "^+")
(setq matchcollect (vlax-invoke-method reg 'Execute str))
(vlax-for match_item matchcollect (setq str (car (list (eval (vlax-get-property match_item 'value))))))
str
)
;;(sortLst (lst))
;;功能:调用vl-sort函数
(defun sortLst (lst)
(vl-sort lst
    'sortLstFun
)
)
;;(sortLstFun (a b))
;;功能:函数vl-sort中的比较函数,返回值为t则vl-sort对表中a、b元素位置进行调换
;;参数:a 为lst中后一个列表元素b 前一个列表元素
;;例:(sortLstFun '("KL2" . "2") '("KL4" . "4"))
;;      返回t
;;作者:Ld_117
(defun sortLstFun (a b / a1 a2 b1 b2 len1 len2 len loop t1 t2 i)
(setq
    a1 (cdr a)
    b1 (cdr b)
    result t
)
(vlax-put-property reg 'pattern "^+")
(setq matchcollect (vlax-invoke-method reg 'Execute (cdr a)))
(vlax-for match_item matchcollect (setq a1 (car (list (eval (vlax-get-property match_item 'value))))))
(setq a2 (vlax-invoke-method reg 'Replace (cdr a) ""))
(setq matchcollect (vlax-invoke-method reg 'Execute (cdr b)))
(vlax-for match_item matchcollect (setq b1 (car (list (eval (vlax-get-property match_item 'value))))))
(setq b2 (vlax-invoke-method reg 'Replace (cdr b) ""))
(if (> (atof a1) (atof b1))
    (setq result nil)
    (if (< (atof a1) (atof b1))
      (setq result t)
      (progn
      (if (= a2 nil) (setq a2 ""))
      (if (= b2 nil) (setq b2 ""))
      (setq
          len1 (strlen a2)
          len2 (strlen b2)
          len (max len1 len2)
          loop t
          i 1
      )
      (if (= len1 0)
          (setq result t)
          (if (= len2 0)
            (setq result nil)
            (while loop
            (setq
                t1 (ASCII (substr a2 i 1))
                t2 (ASCII (substr b2 i 1))
                i (1+ i)
            )
            (if (< t1 t2)
                (setq loop nil result t)
                (if (> t1 t2)
                  (setq loop nil result nil)
                  (setq loop nil result nil)
                )
            )
            )
          )
      )
      )
    )
)
result
)
;;排序函数结束




ld_117 发表于 2024-10-29 09:39:03

wline 发表于 2024-10-28 15:21
下载学习下,不过命令是什么啊

函数,没有命令

wline 发表于 2024-10-29 09:52:16

ld_117 发表于 2024-10-29 09:39
函数,没有命令

麻烦问下那怎么用啊

wline 发表于 2024-10-28 15:21:31

下载学习下,不过命令是什么啊

USER2128 发表于 2015-1-27 11:39:09

我第一个出来支持你!放出源码才是正道!

zhengchuan 发表于 2015-1-27 14:31:24

我也支持你!放出源码才是正道!

ld_117 发表于 2015-1-28 17:27:54

USER2128 发表于 2015-1-27 11:39 static/image/common/back.gif
我第一个出来支持你!放出源码才是正道!

你们能看到源码吗,我不常发帖不知道操作的对不对

lucas_3333 发表于 2015-1-28 21:20:49

ld_117 发表于 2015-1-28 17:27 static/image/common/back.gif
你们能看到源码吗,我不常发帖不知道操作的对不对

发贴没有问题,他是在赞扬你放出源码

ld_117 发表于 2015-1-28 23:53:41

lucas_3333 发表于 2015-1-28 21:20 static/image/common/back.gif
发贴没有问题,他是在赞扬你放出源码

本来想快点升级设置回复可见的。。。捣弄半天没弄成...

lucas_3333 发表于 2015-1-29 08:17:12

ld_117 发表于 2015-1-28 23:53 static/image/common/back.gif
本来想快点升级设置回复可见的。。。捣弄半天没弄成...

论坛不鼓励回复可见的,所以一般等级没这个权限, 另外回复的多少跟你升级没有关系

phoevana 发表于 2015-1-29 08:21:42

支持源码,

emk 发表于 2015-1-30 14:33:59

支持下楼主,没钱就不下了

ld_117 发表于 2015-1-30 17:07:35

emk 发表于 2015-1-30 14:33 static/image/common/back.gif
支持下楼主,没钱就不下了

不是贴源码了吗,复制是一样的,lsp文件是留给土豪下载的
页: [1] 2
查看完整版本: 分享自己编的编号字符串排序函数