高级用户 发表于 2008-6-11 20:06:00

如何调整表内元素?

本帖最后由 作者 于 2008-6-11 20:08:38 编辑 <br /><br /> <p>比如:(setq l '("a" "b" "1" "2" "3" "c"))</p><p>结果是("a" "b" "1" "2" "3" "c")</p><p>如何把顺序调整成("a" "b" "1" "3" "2" "c")</p><p>用vl-sort没搞出来</p>

yxp 发表于 2008-6-11 20:44:00

vl-sort 好像是排序的吧,你这不是在排序吧?

高级用户 发表于 2008-6-11 20:47:00

我这个不是排序,而是把表内某一元素移动到另一元素前面

yxp 发表于 2008-6-11 20:53:00

<p>不是很难啊,我一般用最笨的办法,就是循环</p><p>先求出表的数目,用repeat,然后用cons构建一个新表</p><p>循环到需要交换的序号时(用IF判断)再交换。</p>

高级用户 发表于 2008-6-11 21:39:00

本帖最后由 作者 于 2008-6-11 21:40:06 编辑

瞎搞了个,比较吃力,有没有简单的方法?

;;将表内第5个元素放到第4个前面
(defun c:test()
(setq l '("a" "b" "1" "2" "3" "c"))
(setq i 3)
(setq l4 l l5 l)
(repeat i
(setq l4 (cdr l4))
)
(setq l4 (car l4))
(repeat (+ 1 i)
(setq l5 (cdr l5))
)
(setq l5 (car l5))
(setq l (subst "x" l5 l))
(setq l (subst l5 l4 l))
(setq l (subst l4 "x" l))
)

aroom 发表于 2008-6-11 21:42:00

(setq lst '("a" "b" "1" "2" "3" "c")) =&gt; ("a" "b" "1" "2" "3" "c")<br/>(setq indx (find "3" lst))&nbsp; =&gt; 4<br/>(setq e (pop lst indx))&nbsp; =&gt; "3"<br/>(push e lst (1- indx))&nbsp;&nbsp; =&gt; "3"<br/>lst =&gt; ("a" "b" "1" "3" "2" "c")

aroom 发表于 2008-6-11 21:51:00

<p>;;;如果你知道要交换元素的序号,用swap函数:</p><p>(setq lst '("a" "b" "1" "2" "3" "c")) =&gt; ("a" "b" "1" "2" "3" "c")<br/>(swap&nbsp;3 4&nbsp;lst) =&gt; ("a" "b" "1" "3" "2" "c")<br/></p>

caoyin 发表于 2008-6-11 21:55:00

楼上的高手,findpushswap是哪里的函数,不会是你自定义的吧??

高级用户 发表于 2008-6-11 21:56:00

楼上所用的函数find,pop,push,swap我都没有啊

yxp 发表于 2008-6-11 23:16:00

本帖最后由 作者 于 2008-6-12 13:52:20 编辑 <br /><br /> <p>;;顺便帮你写了一个,bjh是通用的子程序,你试一下看行不。</p><p>;;调用(bjh l a b) 其中:l是表,a和b是要交换的表元素的序号。</p><p><br/>(defun c:test( / a b)<br/>(setq l '("a" "b" "1" "2" "3" "c"))<br/>(setq a 3 b 4)<br/>(setq xl (bjh l a b))<br/>)</p><p>(defun Bjh(li i k / ai bk tem n)<br/>(if&nbsp; (and (&gt;= i 0) (&lt;= i (length li)) (/= i k) (&gt;= k 0) (&lt;= k (length li)))(progn<br/>(setq ai (nth i li) bk (nth k li) tem '() n 0)<br/>(repeat (length li) <br/>&nbsp;&nbsp;&nbsp; (if (= n i) (setq tem (cons bk tem)))<br/>&nbsp;&nbsp;&nbsp; (if (= n k) (setq tem (cons ai tem)))<br/>&nbsp;&nbsp;&nbsp; (if (and (/= n k) (/= n i))(setq tem (cons (nth n li) tem)))<br/>&nbsp;&nbsp;&nbsp; (setq n (1+ n))<br/>) (reverse tem)) li)<br/>)</p><p></p>
页: [1] 2
查看完整版本: 如何调整表内元素?