条件排序,还是有点问题
上次发了一个关于条件排序的帖子,自以为问题已经解决。结果发现还是存在一点问题,排序后original-list少了一个数据,不知问题出在哪里。希望得到的功能是把原始表original-list按照排序条件patterns进行排序,不能匹配的数据放到最后面。
;;条件排序
(defun c:tt ()
(setq original-list0
'(
("B" . "BB")
("C" . "CC")
("A" . "AA")
("F" . "FF")
("E" . "EE")
("D" . "DD")
)
)
(setq original-list1'("BB""CB" "AB" "FB" "EB" "DB" )
)
(setq patterns '("A" "B" "C" "D" "E" "F")
) ;排序条件
(YY:TJPX original-list0 patterns "(car item)") ;最后的参数为运算符
(YY:TJPX original-list1 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
)
)
我好像学Lisp的时候直接跳过排序了,
然后在学C#的时候还不知道有序结构,
回头一看排序其实很简单
https://www.cnblogs.com/JJBox/p/18558660
嘻嘻 建议说清楚排序规则。
除了 ABCDEF, 后面还有GHIJK...吗?不定数量?还是只比较这A~F? 不得先给出你的预期结果? 不得先给出你的预期结果?
e2002 发表于 2024-12-8 20:45
建议说清楚排序规则。
除了 ABCDEF, 后面还有GHIJK...吗?不定数量?还是只比较这A~F?
说的很清楚了,条件不满足时排到后面。条件还可能有,想做个通用排序函数而已。
不过问题已经解决了,只是不够精炼而已。 精炼意味着代码更难懂,菜的代码都没弄明白,搞精炼代码纯是走都没摆正就要跑。 xyp1964 发表于 2024-12-10 11:05
这个不错啊啊:lol xyp1964 发表于 2024-12-10 11:05
这是我最后的完成的代码。现在没问题了
;;按条件排序表中元素, _Mode为运算符,如"item" 、"(car item)"等
(defun YY:TJPX (original-list patterns _Mode / Tmplst)
;; 使用 mapcar 和 apply 函数处理列表
(mapcar
(function
(lambda (tmp)
(mapcar
(function
(lambda (item)
(if (wcmatch (eval (read _mode)) (strcat tmp "*"))
(progn
(setq Tmplst (cons item Tmplst))
(setq original-list (vl-remove item original-list))
)
)
)
)
original-list
)
)
)
patterns
)
(setq Tmplst (append (reverse Tmplst) original-list))
Tmplst
)
页:
[1]