Elixir从列表中删除重复项

时间:2015-05-11 11:28:46

标签: elixir

有人愿意使用Functional Programming和Elixir Constructs为List(X)中的重复值提供一些替代解决方案吗?

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

我想解决这个问题的库存解决方案是迭代列表(X),并添加到一个新的列表(Y),其中密钥尚不存在。

谢谢

3 个答案:

答案 0 :(得分:39)

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, 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 :(得分:1)

另一种可能的解决方案是在创建集合时使用Set:

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

答案 2 :(得分:0)

还使用MapSet

&#34; 3 3 2 1 1&#34; |&GT; String.split |&gt; MapSet.new |&gt; Enum.to_list

==&GT; [&#34; 1&#34;,&#34; 2&#34;,&#34; 3&#34;]