Как я могу определить, содержит ли список дубликаты? - PullRequest
3 голосов
/ 23 октября 2010

Я хочу знать, содержит ли список какое-либо значение более одного раза. Вот что у меня есть.

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.

Есть ли более простой / более краткий / более идиоматический способ сделать это? Я довольно новый в Эрланге.

Ответы [ 3 ]

11 голосов
/ 23 октября 2010
erlang:length(List) == sets:size(sets:from_list(List)).
4 голосов
/ 23 октября 2010

А как насчет этого возможного решения?

has_dupes([H|T]) -> 
 case lists:member(H, T) of 
  true -> true;
  false -> has_dupes(T)
 end;
has_dupes([]) -> false. 
0 голосов
/ 29 декабря 2016

Нужно проверить список двоичных файлов из 2 миллионов элементов.Запустил эти две версии для скорости.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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...