明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3830|回复: 21

如何交换一个表中任意两项的位置

  [复制链接]
发表于 2002-8-21 15:13 | 显示全部楼层 |阅读模式
有一任意表,例如 ("a" "b" "c" "d" "e" "f"),我想要交换其中的任意两项的位置,比如第二项 "b" 和第五项 "e",应返回 ("a" "e" "c" "d" "b" "f"),我想这个问题应该并不难,可是我试过很多方法,都觉得不太好。谁有比较好的方法请赐教。
发表于 2002-8-24 15:36 | 显示全部楼层

那您就找一本《Visual LISP程序设计——技巧与范例》,执行中策吧...

发表于 2002-8-21 15:28 | 显示全部楼层

不知道您都想过什么方法,怎么个“不太好”?

 楼主| 发表于 2002-8-21 15:46 | 显示全部楼层

我用过foreach来返回

我用的方法是:
(defun l-par-swap (par n1 n2 / p n return)
        (setq n 0)
        (foreach p par
                (if (= n n1) (setq p (nth n2 par)) )
                (if (= n n2) (setq p (nth n1 par)) )
                (setq return (append return (list p)) )
                (setq n (+ n 1))
        )
        (setq return return)
)
它的时间性能不好,当表的长度大于1000后,所用时间不能忍受。
发表于 2002-8-21 17:44 | 显示全部楼层

如果表中的数据是唯一的,可试试下面的方法

(defun swap(plist n1 n2 / v1 v2
  (setq v1 (nth n1 plist)
        v2 (nth n2 plist)
        plist (subst 特殊值 v1 plist)
        plist (subst v1 v2 plistt)
        plist (subst v2  特殊值 plist)
  )
  plist
)
;这样,当表较大时速度会快些
 楼主| 发表于 2002-8-22 09:06 | 显示全部楼层

方法不错,但毕竟有缺陷

谢谢您的建议!
这个方法我也试过了,但是使用起来有很多限制。
1。要求原表中的各项维一,不能有相同的项。
2。特殊值的选取要根据实际情况而定,它不能和原表中的任一项相同。
所以,这个方法不能作为一个通用的子程序来使用。
请问大家,有没有更通用一点的方法。
发表于 2002-8-22 14:55 | 显示全部楼层

这方法当然不好,您说过的其他方法呢?

 楼主| 发表于 2002-8-23 09:10 | 显示全部楼层

利用member也可以,不过

 楼主| 发表于 2002-8-23 09:13 | 显示全部楼层

利用member也可以

利用member和append来返回好像也可以,程序如下:
(defun swap (par n1 n2 / m1 m2 par1 l p1 p2 p3 return)
        (setq m1 (nth n1 par)
              m2 (nth n2 par)
              par1 (reverse par)
              l (length par)
              p1 (cdr (member m1 par1))
              p2 (cdr (member m1 par))
              p3 (cdr (member m2 par))
        )
        (while (> (length p1) n1) (setq p1 (cdr (member m1 p1))) )
        (while (> (length p2) (- l n1 1)) (setq p2 (cdr (member m1 p2))) )
        (setq p2 (cdr (member m2 (reverse p2))) )
        (while (> (length p2) (- n2 n1 1)) (setq p2 (cdr (member m1 p2))) )
        (while (> (length p3) (- l n2)) (setq p3 (cdr (member m2 p3))) )
        (print (reverse p1))
        (print (reverse p2))
        (print p3)
        (setq return (append (reverse p1) (list m2) (reverse p2) (list m1) p3))
);swap
但是如果原表中多数项都相同时,性能并不比用foreach好。
发表于 2002-8-23 10:26 | 显示全部楼层

要不您说明原始条件和最终要求,重新讨论处理过程?

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-11 18:21 , Processed in 0.165837 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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