2011-11-16 78 views
5

我正在使用DrRacket中的Lambda中级学生,我想知道如何删除列表中的重复项,同时保持顺序。例如(remove-dup (list 2 5 4 5 1 2))会产生(list 2 5 4 1)。到目前为止,我有这个:如何摆脱列表中的重复项,但保留订单

(define (remove-duplicates lst) 
    (cond 
    [(empty? lst) empty] 
    [(member? (first lst) (rest lst)) 
    (remove-duplicates (rest lst))] 
    [else (cons (first lst) (remove-duplicates (rest lst)))])) 

,但有一个问题,因为它不保持顺序。有人能指引我朝着正确的方向吗?谢谢你的时间。

+4

实际上,它看起来好像*不会保留顺序,只是不保留重复元素的第一个。你确定你的解决方案不正确吗? –

+0

不幸的是该解决方案不正确。例如,如果我有删除重复项(1 2 5 1 4),我想要(列表1 2 5 4),而不是(列表2 5 1 4)的实际值。对不起,这个不好的例子。 –

+0

我正在考虑做一些类似于列表1的内容,然后使用第一个数字在列表的其余部分使用过滤器。除此之外,我不知道如何实现这个哈哈。 –

回答

0

SRFI-1有delete-duplicates,虽然效率不高。 (我不是太熟悉了球拍,但肯定有SRFI-1,和源...)

http://srfi.schemers.org/srfi-1/srfi-1.html#delete-duplicates

+0

我看了一下网站,但我相信所提供的源代码在Racket中不起作用。 –

+2

只需在程序中添加'(require srfi/1)',就可以在Racket中使用'srfi/1'。但是,第一个答案中提到的'remove-duplicates'甚至更容易获得 - 它在Racket中默认存在。 –

0

贯穿名单顺序,在哈希表或其他字典插入每个元素。如果您尝试插入已经在哈希表中的元素,请不要将其添加到外出列表中。

10

如果你的目标是获得功能的工作,而不是一些功课问题,那么你不需要做任何事情,只需使用remove-duplicates

Welcome to Racket v5.2. 
-> (remove-duplicates (list 2 5 4 5 1 2)) 
'(2 5 4 1) 
+0

我有球拍6.0.1,但它告诉我功能未定义 –

+1

您需要使用常规语言,而不是学生语言。 –

0

你需要做的反向是什么比较订购整个时间。您可以使用reverse函数,它以相反的顺序返回一个列表。这样你总是去除第二个元素而不是第一个元素。下面是一个示例,但它使用的是letif而不是cond表达式。

http://www.cs.bgu.ac.il/~elhadad/scheme/duplicates.html

与您的家庭作业:)

0

祝你好运,我不知道这是功课,但在情况下,我会后刚刚的想法。如果它不告诉我,我可以在这里提出解决方案。

您需要的是跟踪您找到的独特项目,您可以使用辅助列表(如累加器)来跟踪您迄今为止发现的项目。

每当你看另一个项目时,检查它是否在辅助列表中。如果它没有添加到辅助列表中。

您将以与您正在尝试查找的内容相反的顺序结束,因此您可以(反向...)并且您将得到您的答案。

+0

你最好将一个散列集合放在一个列表中以保留你所看到的条目。用一个列表,该函数是'Theta(n^2)'。使用哈希集合,它是'Theta(n)'。 – Thumbnail

0

嗯,我刚刚有了一个球拍考试近日,:/

“标准” remove-duplicates工作正常,但我用漂亮的,大的drRacket所以也只好用(require racket/list)

这里是一个被加载使用突变替代方法:)

(不是真的在球拍的精神,但..它的工作原理。)

(define (set l) 
     (define the-set '()) 
      (begin (for-each 
         (lambda (x) 
          (if (member x the-set) 
           #t 
          (set! the-set (cons x the-set)))) 
         l) 
        (reverse the-set))) 

希望这帮助...干杯!

4

这是解决方案:

(define (remove-duplicates lon) 
    (foldr (lambda (x y) (cons x (filter (lambda (z) (not (= x z))) y))) empty lon)) 
0

老问题,但这种为J-Y的想法的实现。

(define (dup-rem lst) 
    (cond 
    [(empty? lst) empty] 
    [else (cons (first lst) (dup-rem (filter (lambda (x) (not (equal? (first lst) x))) lst)))]))