77077 发表于 2014-8-30 21:52:29

表按指定顺序排列,特殊用途.

求高手帮忙啊!(defun sortl (l1 l2 / x l)
(setq l '())
(if (= (length l1)(length l2))
    (while (setq x (car l2))
       (setq l (cons (assoc x l1) l)
             l2 (cdr l2)
             )
    )
)
(reverse l)
)
;测试测试
(sortl '(("赵" ("赵老大" "赵老二")) ("孙" ("孙老大" "孙老二")) ("李" ("李老大" "李老二")) ("钱" ("钱老大" "钱老二"))) '("赵" "钱" "孙" "李"))
;==>(("赵" ("赵老大" "赵老二")) ("钱" ("钱老大" "钱老二")) ("孙" ("孙老大" "孙老二")) ("李" ("李老大" "李老二")))

Gu_xl 发表于 2014-8-31 09:03:09

(vl-sort '(("赵" ("赵老大" "赵老二")) ("孙" ("孙老大" "孙老二")) ("李" ("李老大" "李老二")) ("钱" ("钱老大" "钱老二")))
         '(lambda (a b) (< (VL-POSITION (car a) '("赵" "钱" "孙" "李")) (VL-POSITION (car b) '("赵" "钱" "孙" "李")))))

自贡黄明儒 发表于 2014-9-15 16:04:04

Gu_xl 发表于 2014-8-31 09:03 static/image/common/back.gif


老大,好象不能按("赵" "钱" "孙" "李")排序

Gu_xl 发表于 2014-9-15 16:38:39

自贡黄明儒 发表于 2014-9-15 16:04 static/image/common/back.gif
老大,好象不能按("赵" "钱" "孙" "李")排序

结果:
(("赵" ("赵老大" "赵老二")) ("钱" ("钱老大" "钱老二")) ("孙" ("孙老大" "孙老二")) ("李" ("李老大" "李老二")))
不对么?

自贡黄明儒 发表于 2014-9-15 16:46:39

Gu_xl 发表于 2014-9-15 16:38 static/image/common/back.gif
结果:
(("赵" ("赵老大" "赵老二")) ("钱" ("钱老大" "钱老二")) ("孙" ("孙老大" "孙老二")) ("李" (" ...
刚才在05下运行确实不对,现在重启cad运行,正常了

Gu_xl 发表于 2014-9-15 18:27:44

自贡黄明儒 发表于 2014-9-15 16:46
刚才在05下运行确实不对,现在重启cad运行,正常了

估计你是看花眼了吧!这可不是段誉的六脉神剑,时灵时不灵!

llsheng_73 发表于 2014-9-22 02:41:24

本帖最后由 llsheng_73 于 2014-9-22 02:46 编辑

不用排序的一个办法,估计不如用位置排序来得快
(mapcar'(lambda(x)(vl-remove-if-not'(lambda(y)(=(car y)x))'(("赵" ("赵老大" "赵老二")) ("孙" ("孙老大" "孙老二")) ("李" ("李老大" "李老二")) ("钱" ("钱老大" "钱老二")))))'("赵" "钱" "孙" "李"))
如果用assoc不用vl-remove-if的话,当有多个的时候只能取到先出现的那个,比如下边这样就不能返回所有结果
(mapcar'(lambda(x)(assoc x'(("赵" ("赵老大" "赵老二"))("李" ("李老三" "李老四")) ("孙" ("孙老大" "孙老二"))
          ("赵" ("赵老四" "赵老三")) ("李" ("李老大" "李老二")) ("钱" ("钱老大" "钱老二")))))'("赵" "钱" "孙" "李"))

wayne_myles 发表于 2015-7-22 16:17:10

都是高手,我就是来看看的

yhly555 发表于 2016-10-7 12:52:41

Gu_xl 发表于 2014-8-31 09:03


类似的问题,可以实现按字母升序或降序来对字符串表进行排列吗?
页: [1]
查看完整版本: 表按指定顺序排列,特殊用途.