明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1527|回复: 8

[已解答] 新年快乐,求助如何排序字符串

[复制链接]
发表于 2015-2-19 08:15 | 显示全部楼层 |阅读模式
a1变量存储wl1字符串,余同。
a1 "wl1"     b1 "AL1"  c1 "单相" d1 "1.44"
a2 "wl2"     b2 "AL1"  c2 "单相" d2 "2"
a3 "wl3"     b3 "AL1"  c3 "三相" d3 "5"
a4 "wl1"     b4 "AL2"  c4 "单相" d4 "2"
a5 "wl2"     b5 "AL2"  c5 "单相" d5 "2"
a6 "wl3"     b6 "AL3"  c6 "三相" d6 "2"
a7 "wp2"    b7 "AL2"  c7 "三相" d7 "4"
求个程序,   先把上面的字符串按照  AL1 AL2 AL3 分类排序,然后所有AL1 后面的按照 单相三相排序 (单相在前面三相在后)
如下:
AL1  wl1  单项  1.44
AL1  wl2  单项   2
AL1  wl3  三相   5
   
AL2  wl1  单相   2
AL2  wl2   单相 2
AL2  wp2  三相 4

AL3  wl3  三相  2   
最后祝愿好心人新年快乐
发表于 2015-2-19 11:22 | 显示全部楼层
  1. ;|
  2. ;;;整理数据:
  3. (setq Lst (list (list a1 b1 c1 d1)
  4.                 (list a2 b2 c2 d2)
  5.                 (list a3 b3 c3 d3)
  6.                 (list a4 b4 c4 d4)
  7.                 (list a5 b5 c5 d5)
  8.                 (list a6 b6 c6 d6)
  9.                 (list a7 b7 c7 d7)
  10.                 ))
  11. |;
  12. ;;;得到实际数据:
  13. (setq Lst '(("wl1" "AL1" "单相" "1.44")
  14.             ("wl2" "AL1" "单相" "2")
  15.             ("wl3" "AL1" "三相" "5")
  16.             ("wl1" "AL2" "单相" "2")
  17.             ("wl2" "AL2" "单相" "2")
  18.             ("wl3" "AL3" "三相" "2")
  19.             ("wp2" "AL2" "三相" "4")
  20.             ))
  21. ;;;实际数据排序函数:
  22. (defun sort-lst (Lst)
  23.   (setq Lst (mapcar '(lambda(x) (list (cadr x) (car x) (caddr x) (cadddr x))) Lst))
  24.   (setq Lst (vl-sort Lst '(lambda(x y) (< (nth 3 x) (nth 3 y)))))
  25.   (setq Lst (vl-sort Lst '(lambda(x y) (< (nth 2 x) (nth 2 y)))))
  26.   (setq Lst (vl-sort Lst '(lambda(x y) (< (nth 1 x) (nth 1 y)))))
  27.   (setq Lst (vl-sort Lst '(lambda(x y) (< (nth 0 x) (nth 0 y)))))
  28.   (princ "\n")
  29.   (mapcar '(lambda(x)
  30.              (princ "\n")
  31.              (mapcar '(lambda(y) (princ y) (princ "\t")) x)
  32.              ) Lst)
  33.   (princ "\n")
  34.   (princ)
  35.   )
  36. ;;;执行数据排序:
  37. (sort-lst Lst)

发表于 2015-2-19 16:27 | 显示全部楼层
本帖最后由 xyp1964 于 2015-2-19 16:29 编辑
  1. (setq lst '(("wl1" "AL1" "单相" "1.44")
  2.             ("wl2" "AL1" "单相" "2")
  3.             ("wl3" "AL1" "三相" "5")
  4.             ("wl1" "AL2" "单相" "2")
  5.             ("wl2" "AL2" "单相" "2")
  6.             ("wl3" "AL3" "三相" "2")
  7.             ("wp2" "AL2" "三相" "4")
  8.            )
  9. )
  10. (vl-sort lst
  11.          '(lambda (x y)
  12.             (cond ((and (= (cadr x) (cadr y)) (< (car x) (car y))) t)
  13.                   ((< (cadr x) (cadr y)) t)
  14.             )
  15.           )
  16. )
结果:
'(("wl1" "AL1" "单相" "1.44")
  ("wl2" "AL1" "单相" "2")
  ("wl3" "AL1" "三相" "5")
  ("wl1" "AL2" "单相" "2")
  ("wl2" "AL2" "单相" "2")
  ("wp2" "AL2" "三相" "4")
  ("wl3" "AL3" "三相" "2")
)
发表于 2015-2-20 12:22 | 显示全部楼层

新年好
 楼主| 发表于 2015-2-21 22:24 | 显示全部楼层
谢谢几位朋友的帮助,十分惭愧版主大人的程序没太理解。
(cond ((and (= (cadr x) (cadr y)) (< (car x) (car y))) t)
                  ((< (cadr x) (cadr y)) t)
请问这句话的意思,参数t是什么意思。
发表于 2015-2-23 21:43 | 显示全部楼层
hrbustmqc 发表于 2015-2-21 22:24
谢谢几位朋友的帮助,十分惭愧版主大人的程序没太理解。
(cond ((and (= (cadr x) (cadr y)) (< (car x) ( ...

t是逻辑“真”的意思。
 楼主| 发表于 2015-2-23 22:22 | 显示全部楼层
我看沙发的程序也没有判断逻辑真假啊,请问版主大人,vlsort什么时候用判断逻辑真。

  (setq Lst (vl-sort Lst '(lambda(x y) (< (nth 3 x) (nth 3 y)))))
  (setq Lst (vl-sort Lst '(lambda(x y) (< (nth 2 x) (nth 2 y)))))
  (setq Lst (vl-sort Lst '(lambda(x y) (< (nth 1 x) (nth 1 y)))))
发表于 2015-2-24 07:16 | 显示全部楼层
hrbustmqc 发表于 2015-2-23 22:22
我看沙发的程序也没有判断逻辑真假啊,请问版主大人,vlsort什么时候用判断逻辑真。

  (setq Lst (vl-so ...

后面的逻辑表达式的返回值就可能有t。
发表于 2015-2-26 10:13 | 显示全部楼层
(setq L        '(("wl1" "AL1" "单相" "1.44")
          ("wl3" "AL1" "三相" "5")
          ("wl1" "AL3" "单相" "2")
          ("wl1" "AL2" "单相" "2")
          ("wl2" "AL2" "单相" "2")
          ("wl3" "AL3" "三相" "2")
          ("wl2" "AL1" "单相" "2")
         )
)
(mapcar '(lambda (f) (setq L (vl-sort L '(lambda (x y) (< (f X) (f Y)))))) (list cadddr caddr cadr car))
=========>>>L  
("wl1" "AL1" "单相" "1.44") ("wl1" "AL2" "单相" "2") ("wl1" "AL3" "单相" "2") ("wl2" "AL1" "单相" "2") ("wl2" "AL2" "单相" "2") ("wl3" "AL1" "三相" "5") ("wl3" "AL3" "三相" "2"))
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-5 19:43 , Processed in 0.252744 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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