新年快乐,求助如何排序字符串
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 后面的按照 单相三相排序 (单相在前面三相在后)
如下:
AL1wl1单项1.44
AL1wl2单项 2
AL1wl3三相 5
AL2wl1单相 2
AL2wl2 单相 2
AL2wp2三相 4
AL3wl3三相2
最后祝愿好心人新年快乐
;|
;;;整理数据:
(setq Lst (list (list a1 b1 c1 d1)
(list a2 b2 c2 d2)
(list a3 b3 c3 d3)
(list a4 b4 c4 d4)
(list a5 b5 c5 d5)
(list a6 b6 c6 d6)
(list a7 b7 c7 d7)
))
|;
;;;得到实际数据:
(setq Lst '(("wl1" "AL1" "单相" "1.44")
("wl2" "AL1" "单相" "2")
("wl3" "AL1" "三相" "5")
("wl1" "AL2" "单相" "2")
("wl2" "AL2" "单相" "2")
("wl3" "AL3" "三相" "2")
("wp2" "AL2" "三相" "4")
))
;;;实际数据排序函数:
(defun sort-lst (Lst)
(setq Lst (mapcar '(lambda(x) (list (cadr x) (car x) (caddr x) (cadddr x))) Lst))
(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)))))
(setq Lst (vl-sort Lst '(lambda(x y) (< (nth 0 x) (nth 0 y)))))
(princ "\n")
(mapcar '(lambda(x)
(princ "\n")
(mapcar '(lambda(y) (princ y) (princ "\t")) x)
) Lst)
(princ "\n")
(princ)
)
;;;执行数据排序:
(sort-lst Lst)
本帖最后由 xyp1964 于 2015-2-19 16:29 编辑
(setq lst '(("wl1" "AL1" "单相" "1.44")
("wl2" "AL1" "单相" "2")
("wl3" "AL1" "三相" "5")
("wl1" "AL2" "单相" "2")
("wl2" "AL2" "单相" "2")
("wl3" "AL3" "三相" "2")
("wp2" "AL2" "三相" "4")
)
)
(vl-sort lst
'(lambda (x y)
(cond ((and (= (cadr x) (cadr y)) (< (car x) (car y))) t)
((< (cadr x) (cadr y)) t)
)
)
)
结果:
'(("wl1" "AL1" "单相" "1.44")
("wl2" "AL1" "单相" "2")
("wl3" "AL1" "三相" "5")
("wl1" "AL2" "单相" "2")
("wl2" "AL2" "单相" "2")
("wp2" "AL2" "三相" "4")
("wl3" "AL3" "三相" "2")
)
新年好 谢谢几位朋友的帮助,十分惭愧版主大人的程序没太理解。
(cond ((and (= (cadr x) (cadr y)) (< (car x) (car y))) t)
((< (cadr x) (cadr y)) t)
请问这句话的意思,参数t是什么意思。 hrbustmqc 发表于 2015-2-21 22:24 static/image/common/back.gif
谢谢几位朋友的帮助,十分惭愧版主大人的程序没太理解。
(cond ((and (= (cadr x) (cadr y)) (< (car x) ( ...
t是逻辑“真”的意思。 我看沙发的程序也没有判断逻辑真假啊,请问版主大人,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)))))
hrbustmqc 发表于 2015-2-23 22:22 static/image/common/back.gif
我看沙发的程序也没有判断逻辑真假啊,请问版主大人,vlsort什么时候用判断逻辑真。
(setq Lst (vl-so ...
后面的逻辑表达式的返回值就可能有t。 (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"))
页:
[1]