明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 545|回复: 9

[提问] 条件排序,还是有点问题

[复制链接]
发表于 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
  )
)


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

发表于 2024-12-10 11:05:17 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 1 反对 0

使用道具 举报

发表于 2024-12-8 16:24:04 | 显示全部楼层
我好像学Lisp的时候直接跳过排序了,
然后在学C#的时候还不知道有序结构,
回头一看排序其实很简单
https://www.cnblogs.com/JJBox/p/18558660
嘻嘻
回复 支持 反对

使用道具 举报

发表于 2024-12-8 20:45:24 | 显示全部楼层
建议说清楚排序规则。

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

使用道具 举报

发表于 2024-12-8 21:46:31 | 显示全部楼层
不得先给出你的预期结果?
回复 支持 反对

使用道具 举报

发表于 2024-12-9 08:03:40 | 显示全部楼层
不得先给出你的预期结果?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-9 12:39:51 | 显示全部楼层
e2002 发表于 2024-12-8 20:45
建议说清楚排序规则。

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

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

使用道具 举报

发表于 2024-12-9 12:56:41 | 显示全部楼层
精炼意味着代码更难懂,菜的代码都没弄明白,搞精炼代码纯是走都没摆正就要跑。
回复 支持 反对

使用道具 举报

发表于 2024-12-10 11:13:09 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-10 14:34:42 | 显示全部楼层

这是我最后的完成的代码。现在没问题了
;;按条件排序表中元素, _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
)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-1-14 10:37 , Processed in 0.233174 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表