明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4163|回复: 6

[函数] [求助]老调重弹-求字符串排序通用函数

[复制链接]
发表于 2009-11-19 16:36:00 | 显示全部楼层 |阅读模式

求字符串排序通用函数

1.

(vl-sort '("KL10" "KL8" "KL21" "KL1") '<)
-> ("KL1" "KL10" "KL21" "KL8")

这个明显是不行的。

2. (vl-sort '("KL10" "KL8" "KL21" "KL1")
     '(lambda (X1 X2)
        (< (atoi (substr X1
    3
    (strlen X1)
   )
    )
    (atoi (substr X2
    3
    (strlen X2)
   )
    )
        )
      )
   )
-> ("KL1" "KL8" "KL10" "KL21")

这个虽然可以,但是对于复杂一些的字符串列表。行不通。。。

我印象有看过狂刀的一个贴子有字符串排序的代码。

印象也测试了一下好像不太对。。。

各位讨论一下,提供个思路之类的。。。

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2009-11-19 17:05:00 | 显示全部楼层
关键你自己要制定一个“通用”的排序规矩,有了这个“规矩”之后剩下就是编程了
发表于 2009-11-22 04:12:00 | 显示全部楼层
试一试我这个函数,或许可以满足你的要求。
调用说明:lst-字符串列表;func-排序方式。“'<”为升序,“'>”为降序。
  1. (defun TBC:Sort (lst func / Split CompFunc tmp)
  2.   (defun Split (str / tmp i n p x len lst1 lst)
  3.     (setq tmp  (vl-string->list str)
  4.    lst1 (mapcar '(lambda (x) (and (<= 48 x) (<= x 57))) tmp)
  5.    n    (length lst1)
  6.    i    0
  7.     )
  8.     (while (< i n)
  9.       (setq x (nth i lst1)
  10.      i (1+ i)
  11.       )
  12.       (if (= i 1)
  13. (setq p 1
  14.        len 1
  15. ) ;else
  16. (if (= x (nth (- i 2) lst1))
  17.    (setq len (1+ len)) ;else
  18.    (setq tmp (substr str p len)
  19.   tmp (if x
  20.         tmp
  21.         (atoi tmp)
  22.       )
  23.   lst (append lst (list tmp))
  24.   p   i
  25.   len 1
  26.    )
  27. ) ;if
  28.       ) ;if
  29.     ) ;while
  30.     (if (> n 0)
  31.       (setq tmp (substr str p len)
  32.      tmp (if x
  33.     (atoi tmp)
  34.     tmp
  35.   )
  36.      lst (append lst (list tmp))
  37.       )
  38.     )
  39.     lst
  40.   )
  41.   (defun CompFunc (lst1 lst2 / tmp do flag i n el1 el2 typ1 typ2)
  42.     (setq i  0
  43.    n  (min (length lst1) (length lst2))
  44.    do T
  45.     )
  46.     (while (and do (<= i n))
  47.       (setq el1  (nth i lst1)
  48.      typ1 (type el1)
  49.      el2  (nth i lst2)
  50.      typ2 (type el2)
  51.      i (1+ i)
  52.       )
  53.       (if (= typ1 typ2)
  54. (setq do   (= el1 el2)
  55.        flag (eval (list func el1 el2))
  56. ) ;else
  57. (setq do   nil
  58.        flag (or (= typ1 'nil) (= typ2 'STR))
  59. )
  60.       ) ;if
  61.     ) ;while
  62.     flag
  63.   )
  64.   (setq tmp (mapcar 'Split lst)
  65. tmp (vl-sort-i tmp 'CompFunc)
  66. tmp (mapcar '(lambda (x) (nth x lst)) tmp)
  67.   )
  68.   tmp
  69. )
发表于 2009-11-22 17:02:00 | 显示全部楼层

这种情况一般只需要三步就行

1:将每个字符按照”字母-数字“分解成表(数字为字符串,防止前面有0)

2:然后根据数字所在的表位置进行排序,排序前先把排序的数字字符串转成数字

3:根据排序的标号重新排列字母-数字表,并恢复成原始字符串表

发表于 2009-11-23 07:59:00 | 显示全部楼层
carrot1983发表于2009-11-19 16:36:00我印象有看过狂刀的一个贴子有字符串排序的代码。印象也测试了一下好像不太对。。。各位讨论一下,提供个思路之类的。。。

;;我印象中...

;;含數字的字串排序-----原創 by 無痕(狂刀的前身).2004.6

不知他程序還在嗎?

发表于 2009-11-23 13:20:00 | 显示全部楼层
我印象中,自从用了正则表达式,我把以前文字处理的程序都删了,身体倍儿棒,吃嘛嘛香
不过翻了下箱底,发现一个。对你说的情况如有bug,请自行调整
  1. ;|
  2. ;;;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  3. (strsort strlst) = 含数字后缀的字符串排序-v1.1-------------------lxx.2004.6 ok!
  4. 测试:
  5. (setq lst '("w45""w-3""s""z1""z-4""df676""df24""bff4""bff""bff2""A34""A""A2""A5""bff-5"))
  6. (strsort lst) ->("A" "A2" "A5" "A34" "bff-5" "bff" "bff2" "bff4" "df24" "df676" "s" "w-3" "w45" "z-4" "z1") ok!
  7. |;
  8. (defun strsort (strlst)
  9.   (defun strbrk (str / i st1 n)
  10.     (setq i 0)
  11.     (while (not(or(= "" (setq st1(substr str(setq i(1+ i)))))(setq n(distof st1)))))
  12.     (list (substr str 1 (1- i)) (if n n 0) str)
  13.   )
  14.   (defun x-sort (lst do n)
  15.     (vl-sort lst '(lambda(x y)((eval do)(nth n x)(nth n y))))
  16.   )
  17.   (mapcar 'last (x-sort (x-sort (mapcar 'strbrk strlst) '< 1) '< 0))
  18. )

评分

参与人数 1明经币 +1 收起 理由
wowan1314 + 1 赞一个!

查看全部评分

 楼主| 发表于 2009-11-23 17:03:00 | 显示全部楼层

谢谢各位。

学习一下。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-1 19:36 , Processed in 0.162943 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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