明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1997|回复: 18

[提问] 如何去掉重复的字符串,并且排序

[复制链接]
发表于 2015-2-25 18:43 | 显示全部楼层 |阅读模式
  • ("AL2" "AL2" "AL3" "AL2" "AL1" "AL1" "AL1")
  • 要求:去掉重复的字符串,并且按照AL1,Al2,AL3排序。
  • 期望结果("AL1" "AL2" "AL3" )
发表于 2019-5-28 18:32 | 显示全部楼层
softbird 发表于 2019-5-28 16:47
请教各位大师如何得到("AL1" "AL1" "AL1" "AL2" "AL2"  "AL2" )
即反向操作留下重复的?

准备两个表,一个是重复的,一个是不重复的。用member判断一下,就可以了。

点评

赞一个  发表于 2019-5-29 12:25
回复 支持 1 反对 0

使用道具 举报

发表于 2019-5-28 18:55 | 显示全部楼层
本帖最后由 highflybird 于 2019-5-28 19:16 编辑

提供一个简单的函数,不希望用member函数,对大数据的有可能提高效率

  1. (defun RemDupAndSort (lst / l a)
  2.   (foreach n (vl-sort lst '>)                ;这个地方的大于函数可以替换成你需要的函数
  3.     (if        (= a n)                                ;这个地方的相等比较可以替换成你需要的函数
  4.       l
  5.       (setq a n l (cons n l))
  6.     )
  7.   )
  8. )


在要求效率的场合,要慎用member, 对上面的函数来说,如果用member。对上面的这个歌函数来说,时间可能是O(n^2),而用foreach 函数,不过是排序  的时间加O(n)时间,总的来说还是O(log(n)).
各位有兴趣的话,不妨自我测试一下。


点评

赞一个  发表于 2019-5-29 12:23
回复 支持 1 反对 0

使用道具 举报

发表于 2015-2-25 18:57 | 显示全部楼层

  1. (setq lst '("AL2" "AL2" "AL3" "AL2" "AL1" "AL1" "AL1"))
  2. (setq lst(cx-lst-delsame lst 0.1))
  3. (vl-sort lst '< )
("AL2" "AL2" "AL3" "AL2" "AL1" "AL1" "AL1")
("AL2" "AL3" "AL1")
("AL1" "AL2" "AL3")
发表于 2015-2-25 18:58 | 显示全部楼层
  1. ;删除重复元素.
  2. (defun cx-lst-delsame(lst fuzz / runlst)
  3.         (while lst
  4.                 (setq runlst (cons(car lst)runlst))
  5.                 (setq lst(vl-remove-if '(lambda(x)(equal x (car lst)fuzz)) lst))
  6.         )
  7.         (reverse runlst)
  8. )
 楼主| 发表于 2015-2-25 19:28 | 显示全部楼层
鱼与熊掌 发表于 2015-2-25 18:58

您好请问,为什么我运行时显示。
no function definition: CX-LST-DELSAME
while参数个数不正确。fuzz的值是nil
发表于 2015-2-25 21:23 | 显示全部楼层
感谢 鱼与熊掌 分享程序!
发表于 2015-2-25 21:25 | 显示全部楼层
  1. (vl-load-com)
  2.     (setq zfcb '("AL2" "AL2" "AL3" "AL2" "AL1" "AL1" "AL1")
  3.           fhz  nil
  4.     )
  5.     (while zfcb
  6.        (setq zfc (car zfcb)
  7.              zfcb (vl-remove zfc zfcb)
  8.              fhz (cons zfc fhz)
  9.        )
  10.     )
  11.     (setq fhz (vl-sort fhz '<))

评分

参与人数 1明经币 +1 收起 理由
自贡黄明儒 + 1 乐于助人奖

查看全部评分

发表于 2015-2-25 21:34 | 显示全部楼层
(list '("AL1" "AL2" "AL3"))
发表于 2015-2-26 09:43 | 显示全部楼层

(setq b1 '("AL2" "AL2" "AL3" "AL2" "AL1" "AL1" "AL1") b2 '() i 0)
(repeat (length b1)
  (setq a (nth i b1))
  (if (not (member a b2))
  (setq b2 (cons a b2))
  )
  (setq i (1+ i))
  )
(setq b2 (vl-sort b2 '<))
发表于 2015-2-26 17:23 | 显示全部楼层
yshf 发表于 2015-2-25 21:25

个人觉得稍微有点不太严谨,最后一句排序应该用
  1. (setq fhz (acad_strlsort fhz) )
更为恰当。
发表于 2015-2-26 20:33 | 显示全部楼层
  1. ;; (aaa '("AL2" "AL2" "AL3" "AL2" "AL1" "AL1" "AL1"))
  2. (defun aaa (lst / lst1)
  3.   (foreach a lst
  4.     (if (not (member a lst1))
  5.       (setq lst1 (cons a lst1))
  6.     )
  7.   )
  8.   (vl-sort lst1 '<)
  9. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-24 19:48 , Processed in 0.927335 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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