条件排序问题(已解决)
本帖最后由 wharan 于 2024-11-21 15:14 编辑坛内大侠有过这个条件排序。现在有个问题:原始表original-list中如果有元素("装修")和条件patterns 不匹配(条件中没有"装修"),则把不匹配的元素放置到排序后的表最后。以下程序应该怎样修改?
问题已解决,但不一定时最优解。方法见回复。
(defun c:ttt ()
(setq original-list
'("PS_2_PW" "DIE_1_PW" "PS_PW" "PH_PW"
"DIE_PW" "电气" "PH_1_PW" "DIE_2_PW"
"PS_1_PW" "其他""装修"
)
)
(setq patterns '("DI" "PS" "PH" "其" "电" "水"));排序条件
(TJPX original-list patterns)
)
;;按条件排序表中元素,元素可能是字符串,也可能是子表
(defun TJPX(original-list patterns / )
;; 使用 mapcar 和 apply 函数处理列表
(apply 'append
(mapcar
'(lambda (pattern / filtered-list)
;; 过滤原始列表中匹配当前模式的元素
(if (setq filtered-list
(vl-remove-if-not
'(lambda (item)
(wcmatch item (strcat pattern "*"))
)
original-list
)
)
;; 对过滤后的列表进行排序
(vl-sort filtered-list
'(lambda (item1 item2 / position)
(setq position (+ (strlen pattern) 2))
(< (atoi (substr item1 position 1))
(atoi (substr item2 position 1))
)
)
)
)
)
patterns
)
)
)
最好先分组,将不包含的单独弄成一个表,再排序剩下的形成另外一个表,最后两个表合并。一次排序就直接排出来的话,估计需要的条件逻辑写起来太复杂的。 这个不难吧,分析字符串就好了,含A一堆,含B的一堆,含C的一堆...什么都不含的一堆NO,最后组合ABC NO,就行啦。 增加了原始表根据表中元素位置进行排序的运算符。有一定的通通用性。
(defun c:ttt ()
;(setq original-list
; '(("A" . "Aa") ("B" . "Bb") ("C" . "CC") ("D" . "Dd") ("H" . "Hh")))
(setq original-list
'("PS_2_PW" "DIE_1_PW" "PS_PW" "PH_PW"
"DIE_PW" "电气" "PH_1_PW" "DIE_2_PW"
)
)
(setq patterns '("D" "B" "A" "H")) ;排序条件
(YY:TJPX original-list patterns "item") ;最后的参数为运算符
)
;;(setq patterns '("DI" "PS" "PH" "电")) ;排序条件,当排序条件不存在时放在表的后面
;;(TJPX original-list patterns)
;;按条件排序表中元素, _Mode为运算符,如"item" 、"(car item)"等
(defun YY:TJPX (original-list patterns _Mode)
;; 使用 mapcar 和 apply 函数处理列表
(append
(apply
'append
(mapcar
'(lambda (pattern)
;; 过滤原始列表中匹配当前模式的元素
(vl-remove-if-not
'(lambda (item)
(if (wcmatch (eval (read _mode)) (strcat pattern "*"))
(setq original-list (vl-remove item original-list))
)
)
original-list
)
)
patterns
)
)
original-list
)
)
页:
[1]