wharan 发表于 2024-12-7 20:33:24

条件排序,还是有点问题

上次发了一个关于条件排序的帖子,自以为问题已经解决。结果发现还是存在一点问题,排序后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
)
)


xyp1964 发表于 2024-12-10 11:05:17


你有种再说一遍 发表于 2024-12-8 16:24:04

我好像学Lisp的时候直接跳过排序了,
然后在学C#的时候还不知道有序结构,
回头一看排序其实很简单
https://www.cnblogs.com/JJBox/p/18558660
嘻嘻

e2002 发表于 2024-12-8 20:45:24

建议说清楚排序规则。

除了 ABCDEF, 后面还有GHIJK...吗?不定数量?还是只比较这A~F?

Bao_lai 发表于 2024-12-8 21:46:31

不得先给出你的预期结果?

阿猪蛋 发表于 2024-12-9 08:03:40

不得先给出你的预期结果?

wharan 发表于 2024-12-9 12:39:51

e2002 发表于 2024-12-8 20:45
建议说清楚排序规则。

除了 ABCDEF, 后面还有GHIJK...吗?不定数量?还是只比较这A~F?

说的很清楚了,条件不满足时排到后面。条件还可能有,想做个通用排序函数而已。
不过问题已经解决了,只是不够精炼而已。

kozmosovia 发表于 2024-12-9 12:56:41

精炼意味着代码更难懂,菜的代码都没弄明白,搞精炼代码纯是走都没摆正就要跑。

saint008 发表于 2024-12-10 11:13:09

xyp1964 发表于 2024-12-10 11:05


这个不错啊啊:lol

wharan 发表于 2024-12-10 14:34:42

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]
查看完整版本: 条件排序,还是有点问题