2010-10-22 71 views
4

我想知道列表是否包含任何值不止一次。這是我的。如何檢測列表是否包含重複項?

has_dupes(List) -> 
    has_dupes(List, []). 

has_dupes([Item|List], Seen) -> 
    case lists:filter(fun(Elem) -> Elem == Item end, Seen) of 
     [] -> 
      has_dupes(List, [Item|Seen]); 
     _ -> 
      true 
    end; 
has_dupes([], _Seen) -> 
    false. 

有沒有更簡單/更簡潔/更習慣的方式來做到這一點?我在Erlang很新。

+0

知道是否有重複的目的是什麼?例如,如果在確定重複項之後需要唯一的元素,則可以對元素進行排序,然後將元素放入不允許重複的散列圖中。 – 2010-10-22 21:16:58

+0

@James,我試圖驗證最終來自用戶的數據是否有效,其中包括某些列表中沒有任何重複的元素。我不在乎有沒有免費版本,因爲我想盡快停止檢測不良數據。 – nmichaels 2010-10-22 21:28:47

回答

11
erlang:length(List) == sets:size(sets:from_list(List)). 
4

這種可能的解決方案呢?

has_dupes([H|T]) -> 
case lists:member(H, T) of 
    true -> true; 
    false -> has_dupes(T) 
end; 
has_dupes([]) -> false. 
+0

是的!我必須通讀列表中的函數列表3次,我設法錯過了成員。謝謝。 – nmichaels 2010-10-22 21:59:17

1

只好二進制文件的一枚200萬元素列表進行檢查。跑這兩個版本的速度。 usort似乎贏了,6秒vs 316秒。

14> timer:tc(fun() -> erlang:length(X) == erlang:length(lists:usort(X)) end). 
{6825493,false} 
15> timer:tc(fun() -> erlang:length(X) == sets:size(sets:from_list(X)) end). 
{316297882,false} 
相關問題