在表的指定位置插入和删除元素
本帖最后由 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
再增加一个删除表内重复元素:
;;;;(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))
) 直接贴出来更方便啊
;;;;示例:(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
)
谢谢分享啊 发一个视频看一下,怎么操作 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"),重复的元素保留第一个外,其余删除。
函数就这样使用了,做视频也做不出什么来,能否用着,看你的程序和你的意愿了
Thanks for sharing 正需要,楼主就发布了,不错 本帖最后由 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]