2015-05-11 30 views
13

Qualcuno sarebbe disposto a fornire una soluzione alternativa alla rimozione dei valori duplicati da un elenco (X) utilizzando la programmazione funzionale e i costrutti dell'elisir?Elixir Rimuovere i duplicati dall'elenco

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

La soluzione madre nella mia mente per risolvere questo problema, sarebbe per scorrere l'elenco (X), e aggiungere a una nuova lista (Y) in cui la chiave non esiste già.

Grazie

+1

Questo è un problema di distinzione degli elementi, che è un problema ampiamente ricercato. Sappiamo limiti inferiori per il problema in alcune configurazioni. Può essere risolto in O (nlogn) ordinando + iterate o O (n) in media tempo + spazio usando un hash set. La domanda collegata discute questa domanda. – amit

+0

@amit Correct thanks - Credo che stavo cercando un modo efficace per risolvere il problema usando Elixir Language Constructs e Functional Programming. –

+0

@amit, non penso che questo sia un duplicato. Sta chiedendo una risposta in una lingua specifica e la domanda che hai suggerito di duplicare è una domanda riguardante la complessità algoritmica. Non esattamente la stessa cosa –

risposta

31

Enum.uniq fa ciò che si vuole, ad esempio:

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

in termini di come si sarebbe implementarlo si potrebbe scrivere una funzione ricorsiva in questo modo:

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

Un'altra possibile soluzione è utilizzare Set durante la creazione della raccolta:

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

anche utilizzando MapSet

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

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

Problemi correlati