明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 707|回复: 3

[提问] 条件排序问题(已解决)

[复制链接]
发表于 2024-11-18 23:48:39 | 显示全部楼层 |阅读模式
本帖最后由 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
         )
  )
)




本帖子中包含更多资源

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

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

使用道具 举报

发表于 2024-11-19 08:57:05 | 显示全部楼层
最好先分组,将不包含的单独弄成一个表,再排序剩下的形成另外一个表,最后两个表合并。一次排序就直接排出来的话,估计需要的条件逻辑写起来太复杂的。
回复 支持 反对

使用道具 举报

发表于 2024-11-19 14:42:16 | 显示全部楼层
这个不难吧,分析字符串就好了,含A一堆,含B的一堆,含C的一堆...什么都不含的一堆NO,最后组合ABC NO,就行啦。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-21 15:18:52 | 显示全部楼层
增加了原始表根据表中元素位置进行排序的运算符。有一定的通通用性。
(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
  )
)

回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-22 18:52 , Processed in 0.184915 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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