明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1696|回复: 6

[已解答] 求个函数:以关键词 替换\添加\删除点对表中的元素

[复制链接]
发表于 2014-12-1 14:56:43 | 显示全部楼层 |阅读模式
;以关键词 替换\添加\删除点对表中的元素

替换BC
;(uplstBYindex '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) '(("B" . 10)("C" . 11)))
;=>'(("A" . 1) ("B" . 10) ("C" . 11) ("D" . 4))

添加EF
;(uplstBYindex '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) '(("E" . 10) ("F" . 11)))
;=>'(("A" . 1) ("B" . 10) ("C" . 11) ("D" . 4) ("E" . 10) ("F" . 11))

删除AC
;(uplstBYindex '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) '(("A" . NIL) ("C" . NIL)))
;=>'(("B" . 10) ("D" . 4))


(if (在旧表中能找到关键词)
  (if (= (cdr 新元素) nil)
    (删除模式)
    (更新模式)
  )
  (添加模式)
)

不知道我的表述清楚没有!
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2014-12-1 17:49:56 | 显示全部楼层
本帖最后由 77077 于 2014-12-1 17:51 编辑

半成品
;(tt '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) '("B" . 10))
;=>'(("A" . 1) ("B" . 10) ("C" . 11) ("D" . 4))
;删除AC
;(tt '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) '("C"))
;=>'(("B" . 10) ("D" . 4))

  1. (defun tt (l1 a / ll lt)
  2.   (foreach n l1
  3.     (if (= (car n) (car a))
  4.       (if (cdr a)
  5.          (setq lt (cons (car n) (cdr a))
  6.                ll (cons lt ll)
  7.            )
  8.       )
  9.      (setq ll (cons n ll))
  10.     )
  11.   )
  12.   (reverse ll)
  13. )
发表于 2014-12-1 19:04:50 | 显示全部楼层
这个函数对楼主来说,应该不难!

你自己先写出来, 如果有优化的空间,大家再帮你优化。
 楼主| 发表于 2014-12-1 20:00:15 | 显示全部楼层
本帖最后由 77077 于 2014-12-1 20:04 编辑

就是写不出来哈,修改和删除都弄完了,我不知道怎么弄添加这个选项啊~~~
问题是,怎么判断oldl已经含有newl的项目呢?

  1. (defun tt (oldl newl / tt1 b)
  2. (defun tt1 (oldl a / ll lt)
  3.   (foreach n oldl
  4.     (if (= (car n) (car a))
  5.       (if (cdr a)
  6.          (setq lt (cons (car n) (cdr a))
  7.                ll (cons lt ll)
  8.                )
  9.       )
  10.      (setq ll (cons n ll))
  11.     )
  12.   )
  13. (reverse ll)
  14. )
  15. (while newl
  16.     (setq b (car newl)
  17.              oldl (tt1 oldl b)
  18.              newl (cdr newl)
  19.              )
  20. )
  21. oldl
  22. )
命令:(tt '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) '(("B" . 10)("C" . 11)))
=》(("A" . 1) ("B" . 10) ("C" . 11) ("D" . 4))
命令: (tt '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) '(("B" . 10)("C")))
=》(("A" . 1) ("B" . 10) ("D" . 4))

点评

assoc  发表于 2014-12-1 20:13
发表于 2014-12-1 23:54:43 | 显示全部楼层
等不及了!
  1. ;(setq lst '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) )
  2. ;删A改B加E
  3. ;(t11 lst '(("A" . nil)("B" . 0)("E" . 5)))
  4. ;;对组码型表进行 "删除" 、"替换" 、"增加" 的处理
  5. (defun t11 (o n / c)
  6.     (mapcar
  7.         ''((a)
  8.             (if (setq c (assoc (car a) o))
  9.                 (if (cdr a)
  10.                     (setq o (subst a c o))
  11.                     (setq o (vl-remove-if ''((b)(= (car a) (car b))) o))
  12.                 )
  13.                 (setq o (cons a o))
  14.             )
  15.         )
  16.         n
  17.     )
  18.     o
  19. )

点评

高!思路什么的和我最初想的一样,不过我就是没编出来。。。。。 我是新手,还没搞懂你这临时函数的用法。  发表于 2014-12-2 00:46
 楼主| 发表于 2014-12-2 01:13:43 | 显示全部楼层
wowan3344 发表于 2014-12-1 23:54
等不及了!

看不懂你的,不过抄了点你的代码,弄了一个
(defun tt1 (oldl newl / a b n x)
  (foreach n newl
    (if (setq a (assoc (car n) oldl))
      (if (cdr n)
          (setq oldl (subst n a oldl))
          (setq oldl (vl-remove-if '(lambda(x) (= (car a) (car x))) oldl))
      )
      (setq oldl (cons n oldl))
    )
  )
  oldl
)
;;对组码型表进行 "删除" 、"替换" 、"增加" 的处理
命令: (tt1 '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) '(("A" . nil)("B" . 0)("E" . 5)))
(("E" . 5) ("B" . 0) ("C" . 3) ("D" . 4))
发表于 2014-12-2 05:49:45 来自手机 | 显示全部楼层
assoc+subst
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-23 19:42 , Processed in 0.189089 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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