找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2186|回复: 4

[选择集] (xl-sort# lst dolst)=对多维数组排序

[复制链接]
发表于 2013-6-19 23:55:14 | 显示全部楼层 |阅读模式
函数发布
函数名称: xl-sort#
调用格式: (xl-sort# lst dolst)
参数说明: 参数: lst = 要排序的数组,
dolst = 按位排序所依据的函数列表 = '((i0 func0) (i1 func1) (i2 func2) ...) ;
i* 为要进行排序的维度(元素中第n元素,不需要按照顺序)
func* 分别对应数组lst元素(维,也是表)中的元素序列.
func*可以是任何自定义的含2个参数的函数(注意函数中要对参数为nil时候的判断).如:(< nil 3)=T,(< 3 nil)=nil
注: i* 可根据需要自由设定次序.
返回值: 返回list。
函数简介: 对多维数组排序,按照执行的先后(最后执行的具有结果的最优先)
函数来源: 原创
函数作者: 梁雄啸
适用版本: 不限 
最后更新时间: 2004
备注: 老程序,看着好用拿去,有改进意见尽管提。我没有时间优化,有兴趣的朋友可以跟帖优化。
演示图片: -

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  1. ;;////////////////////////////////////////////////////////////////////////////////;;
  2. ;;(xl-sort# lst dolst)=对多维数组排序,按照执行的先后(最先执行的具有结果的最优先权)----ok!;;2004.8"最后"改为"最先"!.
  3. ;; v 1.1 修正版ok!----------by 梁雄啸.2004.4 (!!版权所有,转贴或使用请保留本信息行!!)
  4. (defun xl-sort# (lst dolst / i)
  5.   (foreach n (reverse dolst)
  6.      (setq i   (car n)
  7.      lst (if n (vl-sort lst '(lambda (x y)((eval (cadr n)) (nth i x)(nth i y))))
  8.          lst))
  9.   )
  10. )
  11. ;;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;;
  12. ;|详细说明:

  13. xl-sort#=对多维数组排序,按照执行的先后(最后执行的具有结果的最优先)
  14. 参数: lst   = 要排序的数组,
  15.       dolst = 按位排序所依据的函数列表 = '((i0 func0) (i1 func1) (i2 func2) ...) ;
  16.               i* 为要进行排序的维度(元素中第n元素,不需要按照顺序)
  17.               func* 分别对应数组lst元素(维,也是表)中的元素序列.
  18.               func*可以是任何自定义的含2个参数的函数(注意函数中要对参数为nil时候的判断).如:(< nil 3)=T,(< 3 nil)=nil
  19. 注:   i* 可根据需要自由设定次序.              
  20. 实例:
  21. 1.(xl-sort# '((0 1)(2 1)(0 2)(3 0)(3 1)(2 3)(1 0)(2 0)(1 1)(1 2)(1 3)) '((0 <) (1 <)))
  22. -> ((0 1) (0 2) (1 0) (1 1) (1 2) (1 3) (2 0) (2 1) (2 3) (3 0) (3 1))
  23. 2.(xl-sort# '((0 1)(2 1)(0 2)(3 0)(3 1)(2 3)(1 0)(2 0)(1 1)(1 2)(1 3)) '((1 <) (0 <)))
  24. -> ((1 0) (2 0) (3 0) (0 1) (1 1) (2 1) (3 1) (0 2) (1 2) (1 3) (2 3))  
  25. 3.(xl-sort# '((1 0 1 0)(2 0 1 1)(2 2 2 1)(1 1 2 1)(1 1 1 3)) '((1 <) (3 >) (0 <) (2 <)))
  26. -> ((2 0 1 1) (1 0 1 0) (1 1 1 3) (1 1 2 1) (2 2 2 1))  
  27. 4.(xl-sort# '((1 0 1 0)(2 3 1 1)(2 2 2 1)(1 0 2 1)(1 1 1 1)) '((0 <) (2 >) nil (4 >)))
  28. -> ((1 0 2 1) (1 0 1 0) (1 1 1 1) (2 2 2 1) (2 3 1 1))  
  29. 6.支持不等维数组.当对应dolst表中func* 不为nil时,维数大的优先.
  30. (xl-sort# '((1 0 1)(2 3 1 1 3)(2 2 1)(1 0 2 1)(1 1 1 1 1)) '((0 <) (2 >) (1 <) nil (4 >)))
  31. -> ((1 0 2 1) (1 0 1) (1 1 1 1 1) (2 2 1) (2 3 1 1 3))
  32. (xl-sort# '((1 0 1)(2 3 1 1 3)(2 2 1)(1 0 2 1)(1 1 1 1 1)(2 0 2)) '((0 <) (1 >) (2 <) (3 >) (4 >)))
  33. -> ((1 1 1 1 1) (1 0 1) (1 0 2 1) (2 3 1 1 3) (2 2 1) (2 0 2))
  34. 7.func*的灵活运用.可以是任何自定义的含2个参数的函数(注意函数中要对参数为nil时候的判断).如:(< nil 3)=T,(< 3 nil)=nil
  35. ;如下 (xrem x y)
  36. ;测试:(xrem 7 9) -> nil ;; (rem 7 3)= 1,(rem 9 3)= 0 ,(< 1 0)= nil.
  37. 代入xosrt:  (xl-sort# '((12 3)(7 4)(5 1)(4 4)(2 5)(3 4)(4 3)(3 1)(3 5)(4 2)(2 3)) '((0 <) (1 xrem)))
  38.       返回 -> ((2 3) (2 5) (3 4) (3 1) (3 5) (4 3) (4 4) (4 2) (5 1) (7 4) (12 3))
  39.       (xl-sort# '((12 3)(7 4)(5 1)(4 4)(2 5)(3 4)(4)(3 1)(3 5)(4 2)(2 3 3)) '((0 <) (1 xrem)))
  40.       -> ((2 3 3) (2 5) (3 4) (3 1) (3 5) (4) (4 4) (4 2) (5 1) (7 4) (12 3))
  41. |;
  42. ;|
  43. (defun xrem (x y)
  44.   (if (or (and (= nil x) y)
  45.           (and x y (< (rem x 3)(rem y 3))))
  46.       T
  47.       nil)
  48. )
  49. ;实战测试:
  50. ;ptsort = 在屏幕点选,调用xl-sort#排序点表,并按排序次序标注序号.
  51. (defun c:ptsort (/ pt lst i)  ;ptlst 全局.
  52.   (vl-cmdf ".undo" "be")
  53.   (while (and (princ "\n取点<上一组点表>:") (setq pt (getpoint)))
  54.     (setq lst (cons pt lst))
  55.   )
  56.   (setq ptlst (if lst lst ptlst))
  57.   (setq i 0)
  58.   (if ptlst
  59.     (foreach n (xl-sort# ptlst '((0 <) (1 <)))
  60.       (vl-cmdf ".text" n "500" "0" (itoa (setq i (1+ i))) "")
  61.     )
  62.   )
  63.   (vl-cmdf ".undo" "e")
  64.   (princ)
  65. )
  66. |;

评分

参与人数 1D豆 +5 收起 理由
xshrimp + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2013-6-19 23:59:27 | 显示全部楼层
这是一个扩展性很强的函数,请自己挖掘,嘿嘿
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-20 05:41:06 来自手机 | 显示全部楼层
江南的想法总给人眼前一亮的感觉,挺一个来自: Android客户端
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2015-2-26 11:04:53 | 显示全部楼层
这是一个扩展性很强的函数;P;P
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2015-11-28 16:20:40 | 显示全部楼层
此函数很实用,尤其在导出到EXCEL等时,赞
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 13:40 , Processed in 0.413807 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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