如何调整表内元素?
本帖最后由 作者 于 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> vl-sort 好像是排序的吧,你这不是在排序吧? 我这个不是排序,而是把表内某一元素移动到另一元素前面 <p>不是很难啊,我一般用最笨的办法,就是循环</p><p>先求出表的数目,用repeat,然后用cons构建一个新表</p><p>循环到需要交换的序号时(用IF判断)再交换。</p> 本帖最后由 作者 于 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))
)
(setq lst '("a" "b" "1" "2" "3" "c")) => ("a" "b" "1" "2" "3" "c")<br/>(setq indx (find "3" lst)) => 4<br/>(setq e (pop lst indx)) => "3"<br/>(push e lst (1- indx)) => "3"<br/>lst => ("a" "b" "1" "3" "2" "c") <p>;;;如果你知道要交换元素的序号,用swap函数:</p><p>(setq lst '("a" "b" "1" "2" "3" "c")) => ("a" "b" "1" "2" "3" "c")<br/>(swap 3 4 lst) => ("a" "b" "1" "3" "2" "c")<br/></p> 楼上的高手,findpushswap是哪里的函数,不会是你自定义的吧?? 楼上所用的函数find,pop,push,swap我都没有啊 本帖最后由 作者 于 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 (and (>= i 0) (<= i (length li)) (/= i k) (>= k 0) (<= k (length li)))(progn<br/>(setq ai (nth i li) bk (nth k li) tem '() n 0)<br/>(repeat (length li) <br/> (if (= n i) (setq tem (cons bk tem)))<br/> (if (= n k) (setq tem (cons ai tem)))<br/> (if (and (/= n k) (/= n i))(setq tem (cons (nth n li) tem)))<br/> (setq n (1+ n))<br/>) (reverse tem)) li)<br/>)</p><p></p>
页:
[1]
2