找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1572|回复: 8

[求助] 关于字符串中带数字的排序

[复制链接]

已领礼包: 12个

财富等级: 恭喜发财

发表于 2005-11-16 22:54:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我编了一个钢筋材料表自动生成的程序,根据钢筋大样图中块的各个属性值,自动生成钢筋材料表。遇到一个问题,就是根据钢筋编号这个属性,将钢筋大样图中各个块的系列属性组成的表排序。
   钢筋编号形式如:N1、N1a、N12、N12a、N12-1、N3' 等.
      如何将其按其中数字大小排序,得到N1、N1a、N3'、N12、N12-1、N12a。。。。。
   当然是钢筋编号都各自存于一个表中,希望得到根据钢筋编号排序后的一系列表组成的新表。   
例如:
原表:
(("N1"  "%%c16"  "20" "1.580" ) ("N1a"  "%%c16"  "20" "1.580" ) ("N12"  "%%c16"  "20" "1.580" ) ("N12a"  "%%c16"  "20" "1.580" ) ("N12-1"  "%%c16"  "20" "1.580" ) ("N3'"  "%%c16"  "20" "1.580" ) )
排序后得到的表:
(("N1"  "%%c16"  "20" "1.580" ) ("N1a"  "%%c16"  "20" "1.580" ) ("N3'"  "%%c16"  "20" "1.580" ) ("N12"  "%%c16"  "20" "1.580" ) ("N12-1"  "%%c16"  "20" "1.580" ) ("N12a"  "%%c16"  "20" "1.580" ) )
       望高手出招!不胜感激!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-11-17 18:26:16 | 显示全部楼层
(vl-sort lst '(lambda(x y)(<(car x)(car y))) )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 12个

财富等级: 恭喜发财

 楼主| 发表于 2005-11-17 22:07:52 | 显示全部楼层
刀兄,结果不对啊!

(setq lst '(("N1" "%%c16" "20" "1.580" ) ("N1a" "%%c16" "20" "1.580" ) ("N3'" "%%c16" "20" "1.580" ) ("N12" "%%c16" "20" "1.580" ) ("N12-1" "%%c16" "20" "1.580" ) ("N12a" "%%c16" "20" "1.580" ) ))
(vl-sort lst '(lambda(x y)(<(car x)(car y))) )

结果是:(("N1" "%%c16" "20" "1.580") ("N12" "%%c16" "20" "1.580") ("N12-1" "%%c16" "20" "1.580") ("N12a" "%%c16" "20" "1.580") ("N1a" "%%c16" "20" "1.580") ("N3'""%%c16" "20" "1.580"))
不是想要得到的结果。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-11-17 22:32:12 | 显示全部楼层
看看
  1. [FONT=courier new](vl-sort '("N1" "N1a" "N3" "N12" "N12-1" "N12a") '<)[/FONT]

的结果:
[php]("N1" "N12" "N12-1" "N12a" "N1a" "N3")[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 12个

财富等级: 恭喜发财

 楼主| 发表于 2005-11-18 18:42:58 | 显示全部楼层
我想要的结果是按其中的数字大小排序,而非字母顺序排序。
看清楚1楼的话啊。

说详细点应该是:对于含有数字的字符串,先将数字前的那部分字符串按字母顺序排序,再安数字大小排序,然后将数字后的字符串按字母顺序排序。
总之,遇见字母按字母顺序排序,遇见数字按数字大小排序。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-11-18 23:44:33 | 显示全部楼层
最初由 ttthhh_hb 发布
[B]我想要的结果是按其中的数字大小排序,而非字母顺序排序。
看清楚1楼的话啊。

说详细点应该是:对于含有数字的字符串,先将数字前的那部分字符串按字母顺序排序,再安数字大小排序,然后将数字后的字符串按字母?.. [/B]

最好都按你的意思定规则!呵呵……
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 111个

财富等级: 日进斗金

发表于 2005-11-19 09:50:09 | 显示全部楼层
(setq zb '(("N1" "%%c16" "20" "1.580")("N1a" "%%c16" "20" "1.580")("N12" "%%c16" "20" "1.580") ("N12a" "%%c16" "20" "1.580")("N12-1" "%%c16" "20" "1.580")("N3'" "%%c16" "20" "1.580")))
(vl-sort zb '(lambda(x y)(<(atof (substr (car x) 2)) (atof (substr (car y) 2)))))
可得:
((N1 %%c16 20 1.580) (N1a %%c16 20 1.580) (N3' %%c16 20 1.580)
(N12 %%c16 20 1.580) (N12a %%c16 20 1.580) (N12-1 %%c16 20 1.580))
基本符合要求。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-11-19 11:08:09 | 显示全部楼层
  1. (vl-sort (vl-sort strlst '(lambda(x y)(<(substr (car x)2)(substr (car y)2))))
  2.   '(lambda(x y)(<(atoi(substr (car x)2))(atoi(substr (car y)2)))))
  3. ;;->
  4. (("N1" "%%c16" "20" "1.580") ("N1a" "%%c16" "20" "1.580") ("N3'" "%%c16" "20" "1.580")
  5.   ("N12" "%%c16" "20" "1.580") ("N12-1" "%%c16" "20" "1.580") ("N12a" "%%c16" "20" "1.580"))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 12个

财富等级: 恭喜发财

 楼主| 发表于 2005-11-19 17:50:05 | 显示全部楼层
谢谢楼上的兄弟们!
       看看“无痕”兄的《含数字后缀的字符串排序》代码,望高手们修改修改,达到我的目的。  
   
  1. ;;;(strsort strlst) = 含数字后缀的字符串排序-无痕.2004.6 ok!
  2. (defun strsort (strlst)
  3.   (defun strbrk        (str / i st1 n)
  4.     (setq i 0)
  5.     (while (not        (or (= "" (setq st1 (substr str (setq i (1+ i)))))
  6.                     (setq n (distof st1))
  7.                 )
  8.            )
  9.     )
  10.     (list (substr str 1 (1- i))
  11.           (if n
  12.             n
  13.             0
  14.           )
  15.           str
  16.     )
  17.   )
  18.   (defun x-sort        (lst do n)
  19.     (vl-sort lst
  20.              '(lambda (x y) ((eval do) (nth n x) (nth n y)))
  21.     )
  22.   )
  23.   (mapcar 'last
  24.           (x-sort (x-sort (mapcar 'strbrk strlst) '< 1) '< 0)
  25.   )
  26. )

  27. ;测试:
  28. ;(setq lst '("w45""w-3""s""z1""z-4""df676""df24""bff4""bff""bff2""A34""A""A2""A5""bff-5"))
  29. ;(strsort lst) ->("A" "A2" "A5" "A34" "bff-5" "bff" "bff2" "bff4" "df24" "df676" "s" "w-3" "w45" "z-4" "z1")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-12 10:33 , Processed in 0.288803 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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