web-dev-qa-db-fra.com

Elixir Supprimer les doublons de la liste

Une personne serait-elle disposée à proposer une solution alternative pour supprimer les valeurs en double d'une liste (X) à l'aide de la programmation fonctionnelle et des constructions Elixir?

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

La solution courante dans mon esprit pour résoudre ce problème serait d’itérer la liste (X) et de l’ajouter à une nouvelle liste (Y) où la clé n’existe pas déjà.

Je vous remercie

16
Dane Balia

Enum.uniq fait ce que vous voulez, par exemple:

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

En termes de mise en œuvre, vous pourriez écrire une fonction récursive comme ceci:

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]
36
Paweł Obrok

Une autre solution possible consiste à utiliser Set lors de la création d'une collection: 

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

Également en utilisant MapSet

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

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

0
Andrei Sura