明经CAD社区

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 102|回复: 3

[提问] 请教如何查找多重表中的元素

[复制链接]
发表于 2018-7-12 19:25 | 显示全部楼层 |阅读模式
有这样一个多重表lst,表中如 "e1"代表编号,((0 0) (3 0) (3 2) (0 2))代表一组坐标值(x y)。
(setq lst
        '(
                ("e1" ((0 0) (3 0) (3 2) (0 2)) "f2" "s1")        ;第一组
                ("e2" ((2 6) (3 6) (3 3) (2 3)) "f4" "s2")        ;第二组
                ("e3" ((3 2) (5 2) (5 0) (3 0)) "f2" "s3")        ;第三组
                ("e4" ((3 7) (6 7) (6 8) (3 8)) "f1" "s4")        ;第四组
                ("e5" ((3 6) (6 6) (6 3) (3 3)) "f4" "s5")        ;第五组
                ("e6" ((3 8) (6 8) (6 9) (3 9)) "f1" "s6")        ;第六组
        )
)
查找条件:
1. 每组坐标中有两个点的坐标值相同,如第一组((0 0) (3 0) (3 2) (0 2))和第三组((3 2) (5 2) (5 0) (3 0)) 有两个点坐标一样 (3 0) (3 2)
2. 满足上述条件的每组这两个点的x坐标相等,如(3 0) (3 2) 中的x坐标都为3
3. 第一重子表的第3个元素相同,如 第一组的"f2" 和第三组的"f2"
返回值:满足上面3个条件的两两配对的编号,如(("e1" "e3") ("e2" "e4"))

请问有什么方法能实现?代码该如何写?
发表于 2018-7-12 19:55 | 显示全部楼层
先检查第2个条件
再检查第1个条件

第2个条件自己写吧
学习下vl-remove-if-not函数

第1个条件
;;表A中去除所有表B中的元素
;;(a-b '(a b b c c c d d d d) '(b c c d e f)) --> '(a)
(defun a-b ( lista listb )
        (if listb
                (foreach x listb
                        (setq lista (vl-remove x lista))
                )
                lista
        )
)
检测返回表的元素个数<=2
即至少两个坐标相同

效率可能不是那么高
但应该可以解决问题
发表于 2018-7-12 20:02 | 显示全部楼层
如果lst的子表个数非常多
也可以先用vl-sort排序
 楼主| 发表于 2018-7-13 08:54 | 显示全部楼层
本来只想到用多重循环一个个比较,最终可能也能达到效果。
楼上高手提供的建议,提供了另外一种解决问题的方法,够我学习和消化一段时间的了。
谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2018-7-19 17:44 , Processed in 0.156715 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

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