845245015 发表于 2022-3-17 16:49:49

表排序

各位大神们,帮忙看看这个怎么处理
((<图元名: 7fffeec0b70> "A-1-1") (<图元名: 7fffeec0b80> "A-1-2") (<图元名: 7fffeec0b90> "A-2-1") (<图元名: 7fffeec0ba0> "A-2-2") (<图元名: 7fffeec0bb0> "A-2-3") (<图元名: 7fffe8806e0> "A-1-3"))
表排序,表如上,处理方式("A-1-1")根据中间的数从大到小排序的同时根据最后的数从小到大排序。
换句话说就是:整个列表根据中间数从大到小排序,如果中间数相同的局部则根据最后一个数从小到大排序

vitalgg 发表于 2022-3-17 17:30:55

(setq lst '(("m" "A-2-1")("m" "A-1-1")("m" "A-2-2")("m" "A-1-2")("m" "A-1-3")("m" "A-2-3")))
(vl-sort
lst
'(lambda (x y)
    (or (> (atoi (cadr (string:to-list (cadr x)"-")))
         (atoi (cadr (string:to-list (cadr y)"-"))))
      (and (= (atoi (cadr (string:to-list (cadr x)"-")))
                (atoi (cadr (string:to-list (cadr y)"-"))))
             (< (atoi (caddr (string:to-list (cadr x)"-")))
                (atoi (caddr (string:to-list (cadr y)"-"))))))))
函数 string:to-list 源码在 http://atlisp.cn/function/string:to-list

xyp1964 发表于 2022-3-18 00:33:04

本帖最后由 xyp1964 于 2022-3-18 00:34 编辑

(setq lst'(("a" "A-1-1")("b" "A-1-2")("c" "A-2-1")("d" "A-2-2")("e" "A-2-3")("f" "A-1-3")))
(vl-sort lst'(lambda(x y)(setq a(xyp-StrSpr(cadr x)"-")b(xyp-StrSpr(cadr y)"-"))
            (cond ((and(=(distof(cadr a))(distof(cadr b)))(<(distof(caddr a))(distof(caddr b))))t)
                  ((>(distof(cadr a))(distof(cadr b)))t)
            )
          )
)

(("c" "A-2-1") ("d" "A-2-2") ("e" "A-2-3") ("a" "A-1-1") ("b" "A-1-2") ("f" "A-1-3"))
页: [1]
查看完整版本: 表排序