web-dev-qa-db-ja.com

Elixirリストから重複を削除

関数型プログラミングとエリクサーコンストラクトを使用して、リスト(X)から重複する値を削除するための代替ソリューションを提供してくれる人はいますか?

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

この問題を解決するための私の心の解決策は、リストを反復し(X)、キーがまだ存在しない新しいリストに追加する(Y)ことです。

ありがとうございました

25
Dane Balia

Enum.uniqはあなたが望むことをします、例えば:

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

それをどのように実装するかという点では、次のような再帰関数を書くことができます。

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

  defp uniq([x | rest], found) do
    if MapSet.member?(found, x) do
      uniq(rest, found)
    else
      [x | uniq(rest, MapSet.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]
47
Paweł Obrok

さらに別の可能な解決策は、コレクションを作成するときにSetを使用することです。

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

MapSetも使用

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

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

0
Andrei Sura