hrbustmqc 发表于 2015-2-25 18:43:40

如何去掉重复的字符串,并且排序


[*]("AL2" "AL2" "AL3" "AL2" "AL1" "AL1" "AL1")
[*]要求:去掉重复的字符串,并且按照AL1,Al2,AL3排序。
[*]期望结果("AL1" "AL2" "AL3" )

自贡黄明儒 发表于 2019-5-28 18:32:24

softbird 发表于 2019-5-28 16:47
请教各位大师如何得到("AL1" "AL1" "AL1" "AL2" "AL2""AL2" )
即反向操作留下重复的?

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

highflybird 发表于 2019-5-28 18:55:24

本帖最后由 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)).
各位有兴趣的话,不妨自我测试一下。


鱼与熊掌 发表于 2015-2-25 18:57:53


(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")

鱼与熊掌 发表于 2015-2-25 18:58:36

;删除重复元素.
(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)
)

hrbustmqc 发表于 2015-2-25 19:28:56

鱼与熊掌 发表于 2015-2-25 18:58 static/image/common/back.gif


您好请问,为什么我运行时显示。
no function definition: CX-LST-DELSAME
while参数个数不正确。fuzz的值是nil

yoyoho 发表于 2015-2-25 21:23:40

感谢 鱼与熊掌 分享程序!

yshf 发表于 2015-2-25 21:25:52

(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 '<))

xyp1964 发表于 2015-2-25 21:34:39

(list '("AL1" "AL2" "AL3"))

fl202 发表于 2015-2-26 09:43:20


(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 '<))

springwillow 发表于 2015-2-26 17:23:07

yshf 发表于 2015-2-25 21:25 static/image/common/back.gif


个人觉得稍微有点不太严谨,最后一句排序应该用(setq fhz (acad_strlsort fhz) )更为恰当。

xyp1964 发表于 2015-2-26 20:33:28

;; (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
查看完整版本: 如何去掉重复的字符串,并且排序