ljxkm 发表于 2019-8-10 17:07:24

在表的指定位置插入和删除元素

本帖最后由 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

ljxkm 发表于 2019-8-11 10:32:36

再增加一个删除表内重复元素:
;;;;(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))
)

ljxkm 发表于 2019-8-10 18:17:10

直接贴出来更方便啊
;;;;示例:(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
)
                                     

烟盒迷唇 发表于 2019-8-10 18:47:11

谢谢分享啊

czb203 发表于 2019-8-14 20:19:57

发一个视频看一下,怎么操作

ljxkm 发表于 2019-8-15 09:01:07

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"),重复的元素保留第一个外,其余删除。
函数就这样使用了,做视频也做不出什么来,能否用着,看你的程序和你的意愿了

ketxu 发表于 2019-8-30 14:17:47

Thanks for sharing

言戲無軍 发表于 2019-9-11 10:59:48

正需要,楼主就发布了,不错

ljxkm 发表于 2019-11-6 12:30:44

本帖最后由 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
)
页: [1]
查看完整版本: 在表的指定位置插入和删除元素