tryhi 发表于 2020-2-28 16:42:53

本帖最后由 tryhi 于 2020-2-28 16:44 编辑

看来不是电脑的问题而是版本的问题,08以下版本超快,我的电脑2010居然要14秒,2018要3秒,其实还能优化算法,主要时间用在了修改布局位置这个指令上,可以优化算法达到最少的改动次数来提高速度

xj6019 发表于 2020-2-28 16:51:13

tryhi 发表于 2020-2-28 16:42
看来不是电脑的问题而是版本的问题,08以下版本超快,我的电脑2010居然要14秒,2018要3秒,其实还能优化算 ...

有时间有兴趣的的话,再帮忙弄一下好吗,谢谢,能做到极致就更完美了!!

tryhi 发表于 2020-2-28 17:02:03

本帖最后由 tryhi 于 2020-2-28 17:03 编辑

思路就是让try-layou-set-position执行最少的次数,本来有多少个布局就执行多少次,有一种情况是执行最多的,就是原来完全是倒序,此时最多只能减掉一次,而其他情况比如乱序的情况,至少可以减掉一半以上,你可以思考一下如何让它执行最少的次数

xj6019 发表于 2020-2-28 17:09:56

tryhi 发表于 2020-2-28 17:02
思路就是让try-layou-set-position执行最少的次数,本来有多少个布局就执行多少次,有一种情况是执行最多的 ...

老师,我的代码水平刚刚学前班毕业水平吧;P,这种复杂的函数基本搞不了,拜托再帮优化一下吧,劳驾您了,谢谢!!

mahuan1279 发表于 2020-2-29 12:00:47

如果字符串仅仅是“ABC-123a”,即前面是“ABC-”,后面是数字加一个小写字母(或者全是数字)的情形,可以采取27进制来简单处理。
_$ (setq lst '((3 "ABC-3")(2 "ABC-4a")(1 "ABC-2a")(5 "ABC-1a")(6 "ABC-1")(7 "ABC-3a")(8 "ABC-2")))
(defun ff (lst)   
(setq vlst nil)
(foreach en lst
                   (setq ntol (strlen (cadr en)))
                   (setq nn (vl-string-position (ascii "-") (cadr en)))
                   (if (= "" (vl-string-trim "123456789" (substr (cadr en) (+ nn 2))))
                     (setq vlst (cons (cons (* 27 (atoi (substr (cadr en) (+ nn 2)))) en) vlst))
                     (setq vlst (cons (cons (+ (* 27 (atoi (substr (cadr en) (+ nn 2) (- ntol 1)))) (- (ascii (substr (cadr en) ntol)) (ascii "a") -1)) en) vlst))
                        )
        )
(mapcar 'cdr (vl-sort vlst '(lambda (ea eb)(< (car ea) (car eb)))))
)
(ff lst)
((3 "ABC-3") (2 "ABC-4a") (1 "ABC-2a") (5 "ABC-1a") (6 "ABC-1") (7 "ABC-3a") (8 "ABC-2"))
FF
((6 "ABC-1") (5 "ABC-1a") (8 "ABC-2") (1 "ABC-2a") (3 "ABC-3") (7 "ABC-3a") (2 "ABC-4a"))
_$

xj6019 发表于 2020-2-29 13:44:18

mahuan1279 发表于 2020-2-29 12:00
如果字符串仅仅是“ABC-123a”,即前面是“ABC-”,后面是数字加一个小写字母(或者全是数字)的情形,可以 ...

辛苦,谢谢回答!

culiang10086 发表于 2021-6-28 22:28:04

用了一下,确实不错,希望有更多的布局工具
页: 1 [2]
查看完整版本: 怎么把布局按照大小自动排列顺序