明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1822|回复: 10

[源码] 相同项分组

[复制链接]
发表于 2022-11-1 09:45:19 | 显示全部楼层 |阅读模式
本帖最后由 dcl1214 于 2024-8-19 13:28 编辑

多个列表中快速分组,您可以拿来快速查找直线顺延,也可以快速分组;如果您有更快的分组方法,可以分享出来一起学习

  1. (defun $根据相同项分组$
  2.                         (dld-xhs  /           i            JILU     s
  3.                          XUNHUAN  group           dld-data tzdata   IS
  4.                          delsame
  5.                         )
  6.   (defun delsame (lst / s-car new)
  7.                                         ;删除表中重复项,删除重复
  8.     (setq lst (vl-remove nil lst))
  9.     (while (setq s-car (car lst))
  10.       (if (vl-position s-car new)
  11.         ()
  12.         (set 'new (cons s-car new))
  13.       )
  14.       (setq lst (cdr lst))
  15.     )
  16.     (setq new (reverse new))
  17.     new
  18.   )
  19.   (if (and dld-xhs (= (type dld-xhs) 'list))
  20.     (progn
  21.       (setq dld-xhs (delsame dld-xhs))        ;排重一下
  22.       (while (setq IS (car dld-xhs))        ;开始读取第一组
  23.         (setq JILU nil)                        ;变量做空
  24.         (SETQ XUNHUAN IS)                ;下面需要循环的数据赋值给xunhuan
  25.         (SETQ JILU (LIST IS))                ;将第一组数据添加到jilu
  26.         (while (setq i (car XUNHUAN))        ;开始读取xunhuan的第一个数据
  27.           (SETQ S NIL)                        ;做空变量
  28.           (setq        s (vl-some (function (lambda (b)
  29.                                        (if (member i b)
  30.                                          B
  31.                                        )
  32.                                      )
  33.                            )
  34.                            (cdr dld-xhs)
  35.                   )                        ;找到与包含I的数据,返回这一组找到的数据,意思是包含I的数据
  36.           )
  37.           (if s
  38.             (PROGN
  39.               (setq dld-xhs (vl-remove S dld-xhs))
  40.                                         ;重置dld-xhs的数据,主要是给while提速的
  41.               (setq JILU (vl-remove nil (cons s JILU)))
  42.                                         ;将找到的这一组数据S添加到jilu
  43.             )
  44.           )
  45.           (setq XUNHUAN (CDR XUNHUAN))        ;重置xunhuan,意思是将第一个数据删除,只留下cdr后面的数据
  46.           (setq XUNHUAN (vl-remove nil (append XUNHUAN s)))
  47.                                         ;将找到的s添加到xunhuan里面去,让while继续找
  48.         )
  49.         (if JILU
  50.           (progn (setq JILU (reverse JILU))
  51.                  (setq group (cons JILU group))
  52.           )
  53.         )                                ;xunhuan变量的所有关联的数据都找到了,此时结果添加到group里面
  54.         (setq dld-xhs (cdr dld-xhs))        ;重置dld-xhs的数据,意思是删除第一个,保留cdr后面的数据
  55.       )
  56.       (setq group (reverse group))        ;倒置
  57.     )
  58.   )
  59.   group
  60. )



  61. ;;;;;;;以下测试代码
  62. (defun c:tt (/ a ents gs i pts ss)
  63.   (AND (setq ss (ssget (list (cons 0 "LINE"))))
  64.        (SETQ ENTS (vl-remove-if
  65.                     (function listp)
  66.                     (mapcar (function cadr) (ssnamex SS))
  67.                   )
  68.        )
  69.        (setq ss nil)
  70.   )
  71.   (setq        pts
  72.          (MAPCAR (FUNCTION (LAMBDA (A)
  73.                              (SETQ DXF (ENTGET A))
  74.                              (LIST (CDR (ASSOC 5 DXF))
  75.                                    (CDR (ASSOC 10 DXF))
  76.                                    (CDR (ASSOC 11 DXF))
  77.                              )
  78.                            )
  79.                  )
  80.                  ENTS
  81.          )
  82.   )
  83.   (SETQ GS ($根据相同项分组$ pts))
  84.   (SETQ i 1)
  85.   (WHILE (SETQ A (CAR GS))
  86.     (if        (>= i 250)
  87.       (setq i 1)
  88.     )
  89.     (setq ents (mapcar 'handent (mapcar 'car a)))
  90.     (mapcar (function (lambda (b / obj)
  91.                         (setq obj (vlax-ename->vla-object b))
  92.                         (vla-put-color obj i)
  93.                       )
  94.             )
  95.             ents
  96.     )
  97.     (setq i (1+ i))
  98.     (SETQ GS (CDR GS))
  99.   )
  100. )
  1. ;示例
  2. (setq d($根据相同项分组$(list(list 1 2 3 4)(list 2 5 6 7 8)(list 5 9 10 11)(list 99 0 18))))
  3. ;返回
  4. (((1 2 3 4) (2 5 6 7 8) (5 9 10 11))
  5. ((99 0 18)))






评分

参与人数 2明经币 +1 金钱 +50 收起 理由
guosheyang + 1 赞一个!
飞雪神光 + 50 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-11-1 10:19:38 | 显示全部楼层
学习.没有看明白相同项特征.用来干什么的.
发表于 2022-11-1 13:27:06 | 显示全部楼层
纯数学算法,看起来没有太大用
发表于 2022-11-5 13:15:15 | 显示全部楼层
快速查找直线顺延    请问杜总  你这个直线顺延 具体是指的啥呢?能否具体解释下   谢谢!
发表于 2022-11-5 18:42:12 | 显示全部楼层
另外  杜总 你这个代码   将列表由小到大排序以后  再分组  速度又可以提升一些  不妨测试下
发表于 2022-11-5 21:23:44 | 显示全部楼层
(defun tt (lst / group is bs as a n)
  (setq group nil)
  (while lst
    (setq is  (car lst)
          lst (cdr lst)
          bs  (list is)
    )
    (while (setq a (car is))
      (if (setq as (vl-remove-if-not '(lambda (x) (member a x)) lst))
        (foreach n as
          (setq        bs  (cons n bs)
                is  (append is n)
                lst (vl-remove n lst)
          )
        )
      )
      (setq is (vl-remove a is))
    )
    (setq group (cons (reverse bs) group))
  )
  (reverse group)
)
发表于 2022-11-5 21:45:59 | 显示全部楼层
新人学习了
 楼主| 发表于 2022-11-5 23:12:15 | 显示全部楼层
kkq0305 发表于 2022-11-5 21:23
(defun tt (lst / group is bs as a n)
  (setq group nil)
  (while lst

5万条数据,循环多久?
发表于 2022-11-6 13:40:27 | 显示全部楼层
dcl1214 发表于 2022-11-5 23:12
5万条数据,循环多久?

经测试数据量大的时候 比如超过1万个列表时   杜总的代码要快很多
发表于 2022-11-6 13:42:09 | 显示全部楼层
本帖最后由 guosheyang 于 2022-11-6 13:44 编辑

这个分组代码可以用于分堆相连图元的坐标分堆提取   用于分堆链式选择也可  直线顺延大概就是指的这个   

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-11-25 09:29 , Processed in 0.170741 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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