明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2524|回复: 8

[函数] 在表的指定位置插入和删除元素

  [复制链接]
发表于 2019-8-10 17:07 | 显示全部楼层 |阅读模式
本帖最后由 ljxkm 于 2019-11-6 12:40 编辑

最近编程需要,写了一对表处理自定义函数,在表指定位置删除和插入元素,自己觉得代码还算简洁,使用效果不错,故贴源码供参考:
;;;;(ljx-del-member (id lst / i lst1)) 删除表中指定位置元素,
;;;;id--要删除的元素的序号,从零开始,id超出表体长度时附于表后返回
;;;;lst--表
;;;;示例:(ljx-del-member 5  '(0 1 2 3 4  "d" "f"))-->(0 1 2 3 4 "f")
;;;;函数作者:        jixiangluo
;;;;最后修改日期2019.8.10

;;;;(ljx-insert-member (id eml lst / i lst1)) 在表中指定位置插入一个元素
;;;;id--要插入元素的位置序号,从零开始,id超出表体长度时原表返回
;;;;eml--要插入的元素
;;;;lst--表
;;;;示例:(ljx-insert-member 5 '("d" "e" "f") '(0 1 2 3 4  "d" "f"))-->(0 1 2 3 4  ("d" "e" "f") "d" "f")
;;;;函数作者:        jixiangluo
;;;;最后修改日期2019.8.10

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
USER2128 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2019-8-11 10:32 | 显示全部楼层
再增加一个删除表内重复元素:
;;;;(ljx-del-duplicated (lst / lst1)) 删除表内重复元素,保留第一个
;;;;lst--要删除重复元素的表格
;;;;示例:;;;;(ljx-del-duplicated '( 1 2 3 4 5 6 7 8 "a" 9 1 2 "a" "b"))-->(1 2 3 4 5 6 7 8 "a" 9 "b")                             
;;;;函数作者:        jixiangluo
;;;;最后修改日期2019.8.11
(defun ljx-del-duplicated (lst / lst1)
  (setq lst1 '())
  (while lst
    (setq lst1 (cons (car lst) lst1)
          lst (vl-remove (car lst) lst)
    )
  )
  (setq lst1 (reverse lst1))
)
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-8-10 18:17 | 显示全部楼层
直接贴出来更方便啊
;;;;示例:(ljx-del-member 5  '(0 1 2 3 4  "d" "f"))-->(0 1 2 3 4 "f")
;;;;函数作者:        jixiangluo
;;;;最后修改日期2019.8.10
(defun ljx-del-member (id lst / i lst1)
  (cond
    ((and (>= id 0) (<= id (1- (length lst))))
     (setq i -1 lst1 '())
     (foreach me lst (progn (setq i (1+ i) lst1 (if (/= i id) (cons me lst1) lst1))))
     (setq lst1 (reverse lst1))
    )
    (T
     (setq lst1 lst)
    )
  );;;;cond
  lst1
)
;;;;(ljx-insert-member (id eml lst / i lst1)) 在表中指定位置插入一个元素
;;;;id--要插入元素的位置序号,从零开始,id超出表体长度时原表返回
;;;;eml--要插入的元素
;;;;lst--表
;;;;示例:(ljx-insert-member 5 '("d" "e" "f") '(0 1 2 3 4  "d" "f"))-->(0 1 2 3 4  ("d" "e" "f") "d" "f")
;;;;函数作者:        jixiangluo
;;;;最后修改日期2019.8.10
(defun ljx-insert-member (id eml lst / i lst1)
  (cond
    ((and (>= id 0) (<= id (1- (length lst))))
     (setq i -1 lst1 '())
     (foreach me lst (progn (setq i (1+ i) lst1 (if (= i id) (cons me (cons eml lst1)) (cons me lst1)))))
     (setq lst1 (reverse lst1))
    )
    (T
     (setq lst1 lst)
    )
  );;;;cond
  lst1
)
                                     
回复 支持 1 反对 0

使用道具 举报

发表于 2019-8-10 18:47 | 显示全部楼层
谢谢分享啊
发表于 2019-8-14 20:19 | 显示全部楼层
发一个视频看一下,怎么操作
 楼主| 发表于 2019-8-15 09:01 | 显示全部楼层
czb203 发表于 2019-8-14 20:19
发一个视频看一下,怎么操作

先在命令行输入三个函数定义部分
  1、在cad命令行输入:(ljx-del-member 5  '(0 1 2 3 4  "d" "f"))
结果-->(0 1 2 3 4 "f"),就删除了第五个元素"d"了。
  2、在cad命令行输入:(ljx-insert-member 5 '("d" "e" "f") '(0 1 2 3 4  "d" "f"))
结果-->(0 1 2 3 4  ("d" "e" "f") "d" "f"),在第五的位置插入了元素("d" "e" "f")
  3、在cad命令行输入:(ljx-del-duplicated '( 1 2 3 4 5 6 7 8 "a" 9 1 2 "a" "b"))
结果-->(1 2 3 4 5 6 7 8 "a" 9 "b"),重复的元素保留第一个外,其余删除。
  函数就这样使用了,做视频也做不出什么来,能否用着,看你的程序和你的意愿了
发表于 2019-8-30 14:17 | 显示全部楼层
Thanks for sharing
发表于 2019-9-11 10:59 来自手机 | 显示全部楼层
正需要,楼主就发布了,不错
 楼主| 发表于 2019-11-6 12:30 | 显示全部楼层
本帖最后由 ljxkm 于 2019-11-6 12:33 编辑

使用中发现在指定位置插入元素最后一个,即插入位置超出表长时,还是直接附于表后比较方便,故修改一下:
;;;;(ljx-insert-member (id eml lst / i lst1)) 在表中指定位置插入一个元素
;;;;id--要插入元素的位置序号,从零开始,id超出表体长度时附于表后返回
;;;;eml--要插入的元素
;;;;lst--表
;;;;示例:(ljx-insert-member 5 '("d" "e" "f") '(0 1 2 3 4  "d" "f"))-->(0 1 2 3 4  ("d" "e" "f") "d" "f");;;;;;       (ljx-insert-member 7 '("d" "e" "f") '(0 1 2 3 4  "d" "f"))-->(0 1 2 3 4   "d" "f" ("d" "e" "f"))
;;;;函数作者:        jixiangluo
;;;;最后修改日期2019.8.10
(defun ljx-insert-member (id eml lst / i lst1)
  (cond
    ((and (>= id 0) (<= id (1- (length lst))))
     (setq i -1 lst1 '())
     (foreach me lst (progn (setq i (1+ i) lst1 (if (= i id) (cons me (cons eml lst1)) (cons me lst1)))))
     (setq lst1 (reverse lst1))
    )
   ((>= id (length lst))
    (setq lst1 (append lst (list eml)))
   )
    (T
     (setq lst1 lst)
    )
  );;;;cond
  lst1
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-24 12:05 , Processed in 5.833808 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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