找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1333|回复: 10

[LISP函数]:如何判断两个表是否相同?

[复制链接]
发表于 2006-2-21 23:54:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
两个表中存放着完全相同的点坐标数据,仅存放的位置被打乱了。用(equal)函数好像不能判别这两个表是相同的(我认为它们相同)。不知道大家有没有好的办法判别呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-2-22 00:21:03 | 显示全部楼层
既然两个表内点坐标顺序不同,从严格意义来说两表当然是不同的。
关键要看对表如何应用,如果仅在每个坐标点插入图块就可以认为两表相同,如果要以坐标点画线就完全不能等同了!
  1. [FONT=courier new];;;判断两表是否元素相同
  2. (defun list-test (plst1 plst2)
  3.   (foreach n plst1
  4.     (if        (not (member n plst2))
  5.       (setq a nil)
  6.     )
  7.   )
  8.   (foreach n plst2
  9.     (if        (not (member n plst1))
  10.       (setq b nil)
  11.     )
  12.   )
  13.   (if (or (= a nil) (= b nil))
  14.     nil
  15.     t
  16.   )
  17. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2006-2-22 10:17:27 | 显示全部楼层
版主,如果a ,b本身爲nil,程序結果可能不對吧?是否應該加一句:


  1.   [FONT=courier new]
  2. (defun list-test (plst1 plst2 / a b)
  3.   (setq        a t
  4.         b t
  5.   )
  6.   (foreach n plst1
  7.     (if        (not (member n plst2))
  8.       (setq a nil)
  9.     )
  10.   )
  11.   (foreach n plst2
  12.     (if        (not (member n plst1))
  13.       (setq b nil)
  14.     )
  15.   )
  16.   (if (or (= a nil) (= b nil))
  17.     nil
  18.     t
  19.   )
  20. )
  21.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-22 15:04:44 | 显示全部楼层
感谢两位的帮忙

点表其实不是严格意义上的无序,仅仅是起点不一样而已。所以对画线没太大影响。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-2-22 18:15:23 | 显示全部楼层
从效率上将,应该先判断表的长度,一样长再判断。。。
(defun tt (lst1 lst2 / )
  (or (= lst1 lst2 nil)
       (and (= (length lst1)(length lst2))
               (...)
       )
  )
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-22 23:07:32 | 显示全部楼层
我换了个思路。
[php]
  (defun tt (plst1 plst2 / n pls1 pls2)
    (setq pls1 plst1
          pls2 plst2
    )
    (foreach n pls1
    (setq plst2 (vl-remove-if '(lambda (x)
                                 (equal x n 1e-3)
                               ) plst2
                ));setq
    );foreach
   
    (foreach n pls2
    (setq plst1 (vl-remove-if '(lambda (x)
                                 (equal x n 1e-3)
                               ) plst1
                ));setq
    );foreach
    (if (and
          (= plst1 '())
          (= plst2 '())
        )
      t
      nil
    );if
  );defun
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-2-22 23:31:46 | 显示全部楼层
(equal (vl-sort plst1 '<) (vl-sort plst2 '<) 1e-3)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2006-2-23 07:16:42 | 显示全部楼层
最初由 eachy 发布
[B](equal (vl-sort plst1 '<) (vl-sort plst2 '<) 1e-3) [/B]


vl-sort 有局限性,对复杂的、包含不同类型元素的表无法进行。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-8 00:48:19 | 显示全部楼层
(1 2 3 )(3 2 1 2 3)算不算相同呢?用楼上的程序测试看看:)
返回是相同的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-8 21:36:52 | 显示全部楼层
比较一下表的长度即可
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-8 23:37:57 | 显示全部楼层
(1 1 2)(2 2 1)呢?
也算一样么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-29 05:50 , Processed in 0.449540 second(s), 52 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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