如何检测列表是否包含重复项?

时间:2010-10-22 21:09:06

标签: erlang

我想知道列表是否包含多次值。这就是我所拥有的。

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的新手。

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:4)

这个可能的解决方案怎么样?

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

答案 2 :(得分:0)

有一个200万元素的二进制文件列表要检查。跑这两个版本的速度。 usort似乎赢了,6秒对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}