2013-11-28 89 views
2

在Racket中是否有內置函數,我們可以根據值而不是值的順序來檢查兩個列表的相等性?比較Racket中的兩個列表

例如,如果比較'(1 2 2 3 4 5)和'(3 1 2 5 4),它應該返回true。

或者實現這種功能的最簡單方法是什麼?

回答

7

如果出現的次數並不重要,那麼您在做設置比較。您可以將列表轉換成集,然後比較集:

> (equal? (list->set '(1 2 3 4 5)) (list->set '(5 4 3 2 1))) 
#t 

如果出現的次數的確很重要,你做多集比較。一個簡單的方法來做這種常見的價值觀是排序兩個列表,然後比較他們的平等以通常的方式:

> (equal? (sort '(3 2 1 4 5) <) (sort '(2 1 3 4 5) <)) 
#t 
> (equal? (sort '(1 2 1) <) (sort '(2 1) <)) 
#f 
+1

謝謝。但是這個解決方案中的問題是,如果我們的清單中有重複的內容?例如比較'(1 2 1)和'(2 1)。 – Elik

+3

@Elik您沒有在您的問題中提及重複項,並且您的示例沒有重複項。 svk回答了你問的問題 - 並給了你兩種方法來做到這一點。你可以通過Stack Overflow搜索「[racket] remove duplicates」,並將其與他的答案結合起來。 –

+1

@Greg Hendershott,我認爲我的問題是一個普遍的問題。 svk並沒有提到第二個解決方案,他在我的評論之後編輯了他的評論。你不必在此寫任何虛假的假設。 – Elik