wharan 发表于 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
         )
)
)




kozmosovia 发表于 2024-11-19 08:57:05

最好先分组,将不包含的单独弄成一个表,再排序剩下的形成另外一个表,最后两个表合并。一次排序就直接排出来的话,估计需要的条件逻辑写起来太复杂的。

chslwj521 发表于 2024-11-19 14:42:16

这个不难吧,分析字符串就好了,含A一堆,含B的一堆,含C的一堆...什么都不含的一堆NO,最后组合ABC NO,就行啦。

wharan 发表于 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
)
)

页: [1]
查看完整版本: 条件排序问题(已解决)