明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5414|回复: 15

《表排序》重金求助

  [复制链接]
发表于 2012-8-7 08:58 | 显示全部楼层 |阅读模式
本帖最后由 redcat 于 2012-8-10 10:28 编辑

【排序规则】
1、比较每个表的第1个元素从小到大排列表alist
2、如果表的第1个元素相等,则以第2个元素从小到大排列表alist
3、如果表的第2个元素相等,则以第3个元素从小到大排列表alist
...
4、以此类推
高山兄的代码错误,先将自己代码放入二楼,期待高手能将我的算法再加改进
示例1:
(sort '((36 90.0 6)
        (3 6)
        (4 5)
        (36 900.00 6)
        (4 5 45)
        (1 4567 900)
        (2 81)
        (2 5 88 1200 900)
        (2 188 7890)
       )
) ;_ 结束sort
((1 4567 900) (2 5 88 1200 900) (2 81) (2 188 7890) (3 6) (4 5) (4 5 45) (36 90.0 6) (36 900.0 6))
示例2:
(sort '(("[" 25 "a")
        ("[" 8)
        ("H" 400 "x" 200 "x" 6 "x" 12)
        ("H" 400 "~" 800 "x" 200 "x" 6 "x" 12)
        ("HW" 350 "x" 350 "x" 10 "x" 19)
        ("H" 80 "x" 20 "x" 6 "x" 8)
        ("L" 50 "x" 4)
        ("L" 100 "x" 10)
        ("~" 8)
        ("H" 400 "x" 200 "x" 6 "x" 8)
        (2 "[" 8)
        ("H" 500 "x" 240 "x" 8 "x" 12)
        ("H" 700 "x" 240 "x" 8 "x" 12)
       )
) ;_ 结束sort
(("H" 80 "x" 20 "x" 6 "x" 8)
  ("H" 400 "x" 200 "x" 6 "x" 8)
  ("H" 400 "x" 200 "x" 6 "x" 12)
  ("H" 400 "~" 800 "x" 200 "x" 6 "x" 12)
  ("H" 500 "x" 240 "x" 8 "x" 12)
  ("H" 700 "x" 240 "x" 8 "x" 12)
  ("HW" 350 "x" 350 "x" 10 "x" 19)
  ("L" 50 "x" 4)
  ("L" 100 "x" 10)
  ("[" 8)
  ("[" 25 "a")
  ("~" 8)
  (2 "[" 8)
)
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2012-8-7 09:00 | 显示全部楼层
本帖最后由 redcat 于 2012-8-8 10:01 编辑

保留区
【排序规则】
1、比较每个表的第1个元素从小到大排列表alist
2、如果表的第1个元素相等,则以第2个元素从小到大排列表alist
3、如果表的第2个元素相等,则以第3个元素从小到大排列表alist
...
4、以此类推

本帖子中包含更多资源

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

x
发表于 2012-8-7 20:25 | 显示全部楼层
  1. (defun foo (l)
  2.   (vl-sort
  3.     l
  4.     (function
  5.       (lambda (e1 e2 / is no a b)
  6.         (while
  7.           (and (setq a (car e1)) (setq b (car e2)) (not is) (not no))
  8.            (if (/= (type a) (type b))
  9.              (if (= (type a) 'STR)
  10.                (setq is t)
  11.                (setq no t)
  12.              )
  13.              (if (< (car e1) (car e2))
  14.                (setq is t)
  15.                (if (> (car e1) (car e2))
  16.                  (setq no T)
  17.                )
  18.              )
  19.            )
  20.            (setq e1 (cdr e1)
  21.                  e2 (cdr e2)
  22.            )
  23.         )
  24.         (if is
  25.           (not no)
  26.           (if no
  27.             nil
  28.             e2
  29.           )
  30.         )
  31.       )
  32.     )
  33.   )
  34. )

评分

参与人数 1明经币 +1 收起 理由
redcat + 1 很给力!算法比我的好

查看全部评分

发表于 2012-8-7 20:29 | 显示全部楼层
这种简单问题,用到挑战赛......
估计没有高手感兴趣,如果楼主是要求助,建议您直接说明
 楼主| 发表于 2012-8-8 09:13 | 显示全部楼层
本帖最后由 redcat 于 2012-8-8 09:19 编辑
chlh_jd 发表于 2012-8-7 20:29
这种简单问题,用到挑战赛......
估计没有高手感兴趣,如果楼主是要求助,建议您直接说明


程序有bug
(foo '((1 90.0 6)
        (1 88 900)
        (1 5)
        (1 900.00 6)
        (1 5 45)(1 6 8)
        (1 4567 900)(1 6)
        (1 81)(1 6 55)
        (1 5 88 )(1 120 90)
        (1 188 7890)
       )
)
((1 90.0 6) (1 5) (1 5 88) (1 6) (1 6 55) (1 81) (1 88 900) (1 900.0 6) (1 5 45) (1 6 8) (1 120 90) (1 188 7890) (1 4567 900))
_$


我的计算结果
(sort '((1 90.0 6)
        (1 88 900)
        (1 5)
        (1 900.00 6)
        (1 5 45)(1 6 8)
        (1 4567 900)(1 6)
        (1 81)(1 6 55)
        (1 5 88 )(1 120 90)
        (1 188 7890)
       )
)
((1 5) (1 5 45) (1 5 88) (1 6) (1 6 8) (1 6 55) (1 81) (1 88 900) (1 90.0 6) (1 120 90) (1 188 7890) (1 900.0 6) (1 4567 900))
_$
发表于 2012-8-10 13:40 | 显示全部楼层
本帖最后由 chlh_jd 于 2012-8-10 13:48 编辑

  1. ;;修正了实数类型和整数类型归为不同类debug
  2. (defun foo (l) ;_by GSLS(SS) 2012-8-10
  3. (vl-sort  l (function  (lambda (e1 e2 / is no a b)
  4.    (while  (and (setq a (car e1)) (setq b (car e2)) (not is) (not no))
  5.      (cond ((and (= (type a) 'STR) (/= (type b) 'STR)) (setq is t))
  6.               ((and (/= (type a) 'STR) (= (type b) 'STR)) (setq no t))
  7.               ((and (= (type a) 'LIST) (/= (type b) 'LIST))(setq no t))
  8.               ((and (/= (type a) 'LIST) (= (type b) 'LIST)) (setq is t))
  9.               ((if (< (car e1) (car e2)) (setq is t)
  10.                    (if (> (car e1) (car e2)) (setq no T)))))     
  11.       (setq e1 (cdr e1)  e2 (cdr e2)))
  12.     (if is  (not no) (if no  nil   e2 ))))))

评分

参与人数 1明经币 +1 收起 理由
redcat + 1 嗯不错,呵呵 效率的确比我的原程序高

查看全部评分

发表于 2012-8-10 13:59 | 显示全部楼层
这里增加了2个判断,一个是表和非表,如果对比项为表和原子,假定规则为原子小于表;
其实还可以加个递归函数,如果子项都是表,对比进行到底!

评分

参与人数 1明经币 +1 收起 理由
redcat + 1 很给力!

查看全部评分

发表于 2012-8-10 14:07 | 显示全部楼层
本帖最后由 aroom 于 2012-8-10 14:08 编辑

直接用 TeaScript 的内建函数:

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
redcat + 1 高手就是高手 很给力

查看全部评分

发表于 2012-8-11 01:03 | 显示全部楼层
本帖最后由 caoyin 于 2012-8-11 01:31 编辑

;;未考虑数字和字符串比较,关键在于排序的规则是如果定的,可以通过自定义<函数实现。。。
(defun sort (LST / REC)
(defun REC (A B);;递归
  (cond ((equal (car A) (car B) 1E-4)
         (REC (cdr A) (cdr B))
        )
        (T (< (car A) (car B)))
  )
)
(vl-sort LST '(lambda (P1 P2)(REC P1 P2)))
)

评分

参与人数 1明经币 +1 收起 理由
redcat + 1 很给力!继续改造 支持嵌套表和混合排序

查看全部评分

发表于 2012-8-11 14:55 | 显示全部楼层
高手,学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 21:31 , Processed in 0.381827 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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