找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2147|回复: 16

[原创] 将表的排序进行到底!!(三)全力打造最强劲的表排序函数!(现在可以下载了l...

[复制链接]

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-6-1 12:34:36 | 显示全部楼层 |阅读模式

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

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

×
将排序进行到底!(1)
[B] 功能全面的通用点表排序函数![/B]
将排序进行到底!(2)
[B] 多功能的表排序函数!
[/B] 将排序进行到底!(3)
[B] 全力打造最强劲的表排序函数!更大的可扩展性让你发现
只有你想不到没有做不到:

将排序进行到底!(3)
支持N层次表!支持自定义比较函数![/B]
测试结果如下:
  1. ;;测试1-------------------------------------------------------
  2. (setq lst '((10 -2)
  3.             (10 2)
  4.             (-11 3)
  5.             (-11 -3)
  6.             (12 -4)
  7.             (-13 5)
  8.             (14 -6)
  9.            )
  10. )
  11. ;;第一项>:
  12. (sortlist-new
  13.   lst
  14.   '("> 1")
  15. )
  16. ;;==》
  17. ((14 -6) (12 -4) (10 -2) (10 2) (-11 3) (-11 -3) (-13 5))
  18. ;;第一项> + 第二项>:
  19. (sortlist-new
  20.   lst
  21.   '("> 1" "> 2")
  22. )
  23. ;;==》
  24. ((14 -6) (12 -4) (10 2) (10 -2) (-11 3) (-11 -3) (-13 5))
  25. ;;第一项绝对值>:
  26. (sortlist-new
  27.   lst
  28.   '(">abs 1")
  29. )
  30. ;;==》
  31. ((14 -6) (-13 5) (12 -4) (-11 3) (-11 -3) (10 -2) (10 2))
  32. ;;第一项绝对值> + 第二项绝对值<:
  33. (sortlist-new
  34.   lst
  35.   '(">abs 1" "<abs 2")
  36. )
  37. ;;==》
  38. ((14 -6) (-13 5) (12 -4) (-11 3) (-11 -3) (10 -2) (10 2))


  39. ;;测试2---------------------------------------------------------------------------------

  40. (setq lst '((14 -6 "ab")
  41.             (12 -4 "abc")
  42.             (10 -2 "abcd")
  43.             (10 2 "abcde")
  44.             (-11 3 "abcdef")
  45.             (-11 -3 "xyz")
  46.             (-13 5 "你好")
  47.            )
  48. )
  49. ;;第二项绝对值>  +  第三项字符长短<:
  50. ;;先定义映射:strlen-fun可在两个中选一种方法;
  51. (setq strlen-fun (eval '(lambda (str) (strlen str))))
  52. (defun strlen-fun (str) (strlen str))
  53. (sortlist-new
  54.   lst
  55.   '(">abs 2" "<strlen-fun 3")
  56. )
  57. ;;==》
  58. ((14 -6 "ab")
  59.   (-13 5 "你好")
  60.   (12 -4 "abc")
  61.   (-11 -3 "xyz")
  62.   (-11 3 "abcdef")
  63.   (10 -2 "abcd")
  64.   (10 2 "abcde")
  65. )


  66. ;;子表前两项和>  +  第三项字符长短<:
  67. ;;先定义映射:1+2-fun strlen-fun
  68. (defun 1+2-fun (a) (+ (car a) (cadr a)))
  69. (sortlist-new
  70.   lst
  71.   '(">1+2-fun" "<strlen-fun 3")
  72. )

  73. ;;测试3-----------------------------------------------------------------------------------
  74. (setq lst '((14 -6 "ab" (1 . 5))
  75.             (12 -4 "abc" (2 . 5))
  76.             (10 -2 "abcd" (3 . 4))
  77.             (10 2 "abcde" (4 . 5))
  78.             (-11 3 "abcdef" (4 . 9))
  79.             (-11 -3 "xyz" (6 . 1))
  80.             (-13 5 "你好" (7 . 0))
  81.            )
  82. )
  83. ;;用 t4中(t2与t1求和)> + 子表前两项和> + t4中的t1项> :
  84. ;;先定义映射:t4[1+2] 1+2-fun
  85. (defun [1+2] (a) (+ (car (nth 3 a)) (cdr (nth 3 a))))
  86. (sortlist-new
  87.   lst
  88.   (list ">[1+2]" ">1+2-fun" "> 4 1")
  89. )
  90. ;;==>
  91. ((-11 3 "abcdef" (4 . 9))
  92.   (10 2 "abcde" (4 . 5))
  93.   (10 -2 "abcd" (3 . 4))
  94.   (12 -4 "abc" (2 . 5))
  95.   (-13 5 "你好" (7 . 0))
  96.   (-11 -3 "xyz" (6 . 1))
  97.   (14 -6 "ab" (1 . 5))
  98. )


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6个

财富等级: 恭喜发财

 楼主| 发表于 2006-6-1 15:55:43 | 显示全部楼层 |阅读模式

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

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

×
如果有什么问题请随时指教!
欢迎提出反例!
看看本函数能不能达到预期目标:
[B]对所有复杂的表进行排序![/B]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-6-1 16:57:06 | 显示全部楼层
下一个


不是吧 什么都没有 老大。。。。。白下了 还要币
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

 楼主| 发表于 2006-6-1 18:02:29 | 显示全部楼层
不知道为什么第一次没传上去!:(大小:0.00 KB,4次下载)
4位朋友对不起了!
重新传上了!这个.fas的测试用不要币了!
如果用的可以再下源程序好了!
请各位老大出表我来用这个函数来排序以验证它的通用性!
大家可以用.fas的去测试的!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-6-2 13:18:58 | 显示全部楼层
还是等你把LISP放上来吧,对于一些特殊要求还是自己做好些
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

 楼主| 发表于 2006-6-2 14:07:45 | 显示全部楼层
WHGF 老兄我的lsp早就放上去了啊!·
在一楼呢!!名叫sortlist(3)的就是了啦!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

 楼主| 发表于 2006-6-4 09:46:26 | 显示全部楼层
i 不会吧?
真的不能下吗???

我试过了完全可以下载的!
老大们请不要误导消费者好不好啦??
要不我真的一个币都捞不到了啦!~~!
这样好了!如果真的有不能下载的
请留下QQ号发到你的QQ邮箱里!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-6-4 11:10:21 | 显示全部楼层
能否对点对第二项排序?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

 楼主| 发表于 2006-6-4 11:18:32 | 显示全部楼层
没有不可以的东东··请出表
上面的测试有:
[php]
(setq lst '((14 -6 "ab")
        (12 -4 "abc")
        (10 -2 "abcd")
        (10 2 "abcde")
        (-11 3 "abcdef")
        (-11 -3 "xyz")
        (-13 5 "你好")
       )
)
;;第二项绝对值>  +  第三项字符长短<:
;;先定义映射:strlen-fun可在两个中选一种方法;
(setq strlen-fun (eval '(lambda (str) (strlen str))))
(defun strlen-fun (str) (strlen str))
(sortlist-new
  lst
  '(">abs 2" "<strlen-fun 3")
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-6-4 19:43:05 | 显示全部楼层
我说的是
'((0 (a . 2) (0 (b . 1))(0 (c . 0)))
中的 2 1 0
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-6-4 21:40:32 | 显示全部楼层
排序不是有现成的函数:

  1.               ;;;排序
  2.         (setq listzxjd (vl-sort        listzxjd
  3.                                 (function (lambda (e1 e2)
  4.                                             (if        (< (abs(- (car e1) (car e2))) wjm_Y_diet );_如果X坐标相等,则按照Y坐标排列
  5.                                               (< (cadr e1) (cadr e2))
  6.                                               (< (car e1) (car e2))
  7.                                             )
  8.                                           )
  9.                                 )
  10.                        )
  11.         )


语法

      (vl-sort  list comparison-function)

功能

     根据给定的比较函数来对表中的元素排序。

说明

1)参数 list 为任意表。

2)comparison-function 为比较函数。可以是任何一个这样的函数:接受如下两个参数,若第一个参数按排序顺序在第二个元素之前,则返回 T 或非 nil 值。comparison-function 的值可以采用如下格式:

。符号 (函数名)

。'(LAMBDA (L1 L2) ...)

。(FUNCTION (LAMBDA (L1 L2) ...))

返回值:

表,其中包含 list 中的元素,这些元素按照 comparison-function 中指定的顺序排列。该表可能删除了重复的元素。

样例:

1)对数值表排序:

_$ (vl-sort '(3 2 1 3) '>)

( 3 2 1 )     ;  

2)按 Y 坐标对二维点表排序:

(vl-sort '((3 5) (2 2) (4 3))

             (function (lambda (e1 e2)

                         (< (cadr e1) (cadr e2)) ) ) )

((2 2) (4 3) (3 5))

3)对符号表排序:

_$ (vl-sort  

   '(a d c h b a)

   '(lambda (s1 s2)

     (< (vl-symbol-name s1) (vl-symbol-name s2)) ) )

(A B C D H)      ;  请注意在结果表中仅有一个 A
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

 楼主| 发表于 2006-6-5 08:02:40 | 显示全部楼层
雨箭风刀:
[php]
(setq a
       '(
         (0 (a . 2))
         (0 (b . 1))
         (0 (c . 0))
         (0 (d . 3))
        )
)
;你说的用T2中的T2排列.
;定义映射:
(defun cdrx (x) (cdr x))
;从小到大
(sortlist-new a (list "<cdrx 2"))
;从大到小
(sortlist-new a (list ">cdrx 2"))
[/php]

wujimmy :
vl-sort 是基础排序函数!功能是不可挑战的!
以至于几乎所有的排序函数都少不了它了.
只是有时对复杂的表排序用起来很烦!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 9个

财富等级: 恭喜发财

发表于 2013-6-2 10:21:39 | 显示全部楼层

(defun sort-pt-1 (plts fun n)

  (vl-sort plts

           '(lambda (a b)

              (fun (nth n a) (nth n b))

            )

  )

)

(defun sort-pt (plst xyz / fun)

  (setq xyz (vl-string->list xyz))

  (foreach n-xyz (reverse xyz)

    (if        (< n-xyz 100)

      (setq fun          >

            n-xyz (- n-xyz 88)

            plst  (sort-pt-1 plst fun n-xyz)

      )

      (setq fun          <

            n-xyz (- n-xyz 120)

            plst  (sort-pt-1 plst fun n-xyz)

      )

    )

  )

)


                                        ;-------------------------------------------------
(defun C:hdm (/ S1 S2 I)
  (setq en (entsel "选择一条直线:"))
                                        ;(setq size 0.1)
  (SETQ S1 (ssget '((0 . "POINT"))))
  (SETQ n 0)

  (repeat (sslength s1)
    (setq lst (cons (ssname s1 n) lst)
          n   (1+ n)
    )
  )


  (setq
    x (mapcar '(lambda (x) (car (cdr (assoc 10 (entget x))))) lst)
  )

  (setq
    y (mapcar '(lambda (x) (cadr (cdr (assoc 10 (entget x)))))
              lst
      )
  )

  (setq        maxx (eval (cons 'max x))
        minx (eval (cons 'min x))
  )
  (setq        maxy (eval (cons 'max y))
        miny (eval (cons 'min y))
  )
  (setq        dx (- maxx minx)
        dy (- maxy miny)
  )
  (if (> dx dy)
    ;;x坐标排序:
    (setq S2 (sort-pt-1 s1 "x" n))
    ;;y坐标排序:
    (setq S2 (sort-pt-1 s1 "y" n))
  )
  (progn
    (setq I 0)
    (repeat (sslength S2)
      (setq pen_data (entget (ssname s2 i)))
      (setq ppt (assoc 10 pen_data))
      (setq pp (cdr ppt))
      (setq Perpt (vlax-curve-getClosestPointTo (car en) pp T))
                                        ;找出垂点
      (entmake (APPEND '((0 . "LINE")
                         (100 . "AcDbEntity")
                         (100 . "AcDbLine")
                         (8 . "0")
                        )
                       (LIST (CONS 10 pp) (CONS 11 perpt))

               )
      )
      (princ "\n")
      (princ (cdddr (assoc 10 (entget (ssname S2 I)))))
                                        ;显示排序结果。
      (setq I (1+ I))
    )
  )

  (princ)
)
为何提示参数错误呢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 11:09 , Processed in 0.536740 second(s), 62 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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