我想知道列表是否包含多次值。这就是我所拥有的。
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 :(得分: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}