马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
前面写的那个点排序只对点表
下面发的可对任何[B]"对应项可排序"[/B]的表.
没有太多用过不知道效果乍的?
请大家试用!看还有什么不足!敬请指教!多谢!

- (defun sort-one (getlist st / intlst astr bstr fun-lambda intlst lam
- str-a str-b)
- (setq intlst (mapcar '1- (read (strcat "(" (substr st 2) ")"))))
- (setq str-a " a")
- (setq str-b " b")
- (if intlst
- (setq astr (foreach tmp intlst
- (setq str-a (strcat " (nth " (itoa tmp) str-a ")"))
- )
- bstr (foreach tmp intlst
- (setq str-b (strcat " (nth " (itoa tmp) str-b ")"))
- )
- )
- )
- (setq lam (strcat "(FUNCTION (lambda (a b) ("
- (substr st 1 1)
- astr
- bstr
- ")))"
- )
- )
- (setq fun-lambda (cadr (eval (read lam))))
- (vl-sort getlist
- 'fun-lambda
- )
- )
- (defun sortlist (lst fun-lst)
- (foreach tmp (reverse fun-lst)
- (setq lst (sort-one lst tmp))
- )
- )

- ;;用法说明:
- ;;顺次写出比较式"< or >"与比较量于list中
- ;;多层次时用"/s"空格连接如:记下表为testlist
- ;;'(
- ;; ("kaj" (4 ("c" 1)))
- ;; ("kbj" (6 ("a" 3)))
- ;; ("kcj" (5 ("b" 2)))
- ;; )
- ;;比较1,3,2时请用(sortlist testlist (list ">2 2 2"))
- ;;比较c,a,b时请用(sortlist testlist (list ">2 2 1"))
- ;;比较4,6,5时请用(sortlist testlist (list ">2 1"))
- ;;比较kaj,kbj,kcj时请用(sortlist testlist (list ">1"))
- ;;一起按级别比是用:(sortlist testlist (list ">2 2 2" ">2 2 1" ">2 1" ">1"))
- ;;;测试如下:
- (defun c:test ()
- (sortlist
- '(
- (1 (1 . 2) 3 ("kkj" 4) (3 0))
- (1 (1 . 4) 1 ("skj" 45) (2 3))
- (1 (1 . 2) 3 ("Aej" 45) (7 1))
- (1 (2 . 3) 2 ("ser" 4) (9 2))
- (2 (6 . 2) 2 ("Serj" 9) (1 4))
- (3 (3 . 5) 1 ("kkjsd" 35) (7 6))
- (2 (4 . 7) 2 ("Akjdd" 3) (5 4))
- (3 (3 . 3) 3 ("sekj" 446) (3 4))
- (2 (2 . 2) 2 ("serj" 9) (1 4))
- (1 (8 . 2) 2 ("wggj" 46) (2 4))
- (1 (1 . 4) 1 ("kkj" 9) (4 4))
- (3 (3 . 3) 3 ("sekj" 446) (3 4))
- (1 (8 . 2) 2 ("wggj" 46) (2 4))
- )
- (list
- ;;排序条件:
- ;;第一条件,依据数据("kkj" 4)中的'kkj' =4项中第1
- ">4 1"
- ;;第二条件,依据数据'1',即 =第1项
- ">1"
- ;;第三条件,依据数据(1 . 4)中的 1 =2项中第1
- ">2 1"
- ;;第四条件,依据数据(3 0)中的 0 =5项中第2
- ">5 2"
- ;;第五条件,依据数据("kkj" 4)中的 4 =4项中第2
- ">4 2"
- ;;排序的优先级为1、2、3、4、5
- )
- )
- )
|