2011-11-16 117 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)))]))