wharan 发表于 2022-4-6 14:56:05

排序问题,还有没有更简单的办法?

;;以下子程序按既定专业排序
(defun zypx (lst / i Lstok Newlst tmp tmp1 lst1)
(setqLstok '("*总*"   "*规*"   "*建*"   "*结*"      "*水*"
    "*暖*"   "*电*"   "*饰*"    )
)
(setq Lst '("建筑" "电气" "给排水" "规划" "暖通" "总图" "装饰" "结构")
(setq Newlst '())
(foreach tmp LstOK
    (foreach tmp1 Lst1
      (if (wcmatch tmp1 tmp)
(setq Newlst (cons tmp1 Newlst))
      )
    )
)
(setq Newlst (reverse Newlst))
Newlst
)这是一个排序问题,就是要把Lst 表中的元素按照LstOK 中的顺序排列。嵌套循环固然没有问题,还有没有其他更简单或者效率更高的办法呢?

菜卷鱼 发表于 2022-4-6 15:30:32

建议你再把vl-sort 的用法再看50遍

(defun _nthlst (str strlst / i s)
(setq i 0)
(vl-some '(lambda (x)
      (setq i (1+ i))
      (if (wcmatch str x)
    (setq s i)
      )
      )
   strlst
)
s
)
(defun sortlst2lstok (lst lstok)
(vl-sort lst
           (function
             (lambda (x y) (< (_nthlst x lstok) (_nthlst y lstok)))
           )
)
)


夏生生 发表于 2022-4-6 16:02:38

无需排序
(setq Lstok '("*总*" "*规*" "*建*" "*结*" "*水*" "*暖*" "*电*" "*饰*"))
(setq Lst '("建筑" "电气" "给排水" "规划" "暖通" "总图" "装饰" "结构"))
(apply 'append
       (mapcar
   (function
   (lambda (x)
       (vl-remove-if-not (function (lambda (y) (wcmatch y x))) lst)
       )
   )
   Lstok
   )
       )

自贡黄明儒 发表于 2022-4-6 16:43:54

(mapcar '(lambda (y) (car (vl-remove-if-not '(lambda (x) (wcmatch x y)) Lst))) Lstok)

x_s_s_1 发表于 2022-4-6 17:03:57

自贡黄明儒 发表于 2022-4-6 16:43
(mapcar '(lambda (y) (car (vl-remove-if-not '(lambda (x) (wcmatch x y)) Lst))) Lstok)

您的代码,如未一一对应是不行的
页: [1]
查看完整版本: 排序问题,还有没有更简单的办法?