如何去掉重复的字符串,并且排序
[*]("AL2" "AL2" "AL3" "AL2" "AL1" "AL1" "AL1")
[*]要求:去掉重复的字符串,并且按照AL1,Al2,AL3排序。
[*]期望结果("AL1" "AL2" "AL3" )
softbird 发表于 2019-5-28 16:47
请教各位大师如何得到("AL1" "AL1" "AL1" "AL2" "AL2""AL2" )
即反向操作留下重复的?
准备两个表,一个是重复的,一个是不重复的。用member判断一下,就可以了。 本帖最后由 highflybird 于 2019-5-28 19:16 编辑
提供一个简单的函数,不希望用member函数,对大数据的有可能提高效率
(defun RemDupAndSort (lst / l a)
(foreach n (vl-sort lst '>) ;这个地方的大于函数可以替换成你需要的函数
(if (= a n) ;这个地方的相等比较可以替换成你需要的函数
l
(setq a n l (cons n l))
)
)
)
在要求效率的场合,要慎用member, 对上面的函数来说,如果用member。对上面的这个歌函数来说,时间可能是O(n^2),而用foreach 函数,不过是排序的时间加O(n)时间,总的来说还是O(log(n)).
各位有兴趣的话,不妨自我测试一下。
(setq lst '("AL2" "AL2" "AL3" "AL2" "AL1" "AL1" "AL1"))
(setq lst(cx-lst-delsame lst 0.1))
(vl-sort lst '< )
("AL2" "AL2" "AL3" "AL2" "AL1" "AL1" "AL1")
("AL2" "AL3" "AL1")
("AL1" "AL2" "AL3") ;删除重复元素.
(defun cx-lst-delsame(lst fuzz / runlst)
(while lst
(setq runlst (cons(car lst)runlst))
(setq lst(vl-remove-if '(lambda(x)(equal x (car lst)fuzz)) lst))
)
(reverse runlst)
) 鱼与熊掌 发表于 2015-2-25 18:58 static/image/common/back.gif
您好请问,为什么我运行时显示。
no function definition: CX-LST-DELSAME
while参数个数不正确。fuzz的值是nil 感谢 鱼与熊掌 分享程序! (vl-load-com)
(setq zfcb '("AL2" "AL2" "AL3" "AL2" "AL1" "AL1" "AL1")
fhznil
)
(while zfcb
(setq zfc (car zfcb)
zfcb (vl-remove zfc zfcb)
fhz (cons zfc fhz)
)
)
(setq fhz (vl-sort fhz '<)) (list '("AL1" "AL2" "AL3"))
(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 '<)) yshf 发表于 2015-2-25 21:25 static/image/common/back.gif
个人觉得稍微有点不太严谨,最后一句排序应该用(setq fhz (acad_strlsort fhz) )更为恰当。 ;; (aaa '("AL2" "AL2" "AL3" "AL2" "AL1" "AL1" "AL1"))
(defun aaa (lst / lst1)
(foreach a lst
(if (not (member a lst1))
(setq lst1 (cons a lst1))
)
)
(vl-sort lst1 '<)
)
页:
[1]
2