2015-05-11 14 views
13

Czy ktoś byłby skłonny dostarczyć alternatywnego rozwiązania do usuwania duplikatów z Listy (X) za pomocą Funkcjonalnego Programowania i Konstrukcji Eliksirów?Eliksir Usuń duplikaty z listy

X = [1,26,3,40,5,6,6,7] # the 6 being the duplicate 

Roztwór podstawowy w moim umyśle na rozwiązanie tego problemu, byłoby iteracyjne listę (X) i dodać do nowej listy (Y), gdzie jest klucz nie istnieje.

Dziękuję

+1

Jest to problem odrębności elementu, który jest szeroko badanym problemem. Znamy dolną granicę problemu w niektórych konfiguracjach. Można go rozwiązać w O (nlogn), sortując + iteracyjnie lub O (n) na średnim czasie + spacja, używając zestawu skrótu. Połączone pytanie omawia to pytanie. – amit

+0

@amit Poprawnie dziękuję - Wierzę, że szukałem skutecznego sposobu rozwiązania problemu za pomocą Elixir Language Constructs i Functional Programming. –

+0

@amit, nie sądzę, że jest to duplikat. Poprosił o odpowiedź w określonym języku, a pytanie, które sugerowałeś, że powtarza, jest pytaniem dotyczącym algorytmicznej złożoności. Niezupełnie to samo. –

Odpowiedz

31

Enum.uniq robi to, co chcesz, na przykład:

iex(6)> Enum.uniq([1,26,3,40,5,6,6,7]) 
[1, 26, 3, 40, 5, 6, 7] 

W kategoriach jak chcesz go realizować można napisać rekurencyjną funkcję tak:

defmodule Test do 
    def uniq(list) do 
    uniq(list, HashSet.new) 
    end 

    defp uniq([x | rest], found) do 
    if HashSet.member?(found, x) do 
     uniq(rest, found) 
    else 
     [x | uniq(rest, HashSet.put(found, x))] 
    end 
    end 

    defp uniq([], _) do 
    [] 
    end 
end 

iex(3)> Test.uniq([1, 1, 2, 3, 4, 4, 1]) 
[1, 2, 3, 4] 
1

Jeszcze innym możliwym rozwiązaniem jest użycie Seta podczas tworzenia kolekcji:

[1, 1, 2, 3, 4, 2, 1] |> Enum.into(HashSet.new) #HashSet<[2, 3, 4, 1]> 
0

również za pomocą Mapset

"3 3 2 1 1" |> String.split |> MapSet.new |> Enum.to_list

==> [ "1", "2", "3"]