Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir从列表中删除重复项_Elixir - Fatal编程技术网

Elixir从列表中删除重复项

Elixir从列表中删除重复项,elixir,Elixir,有人愿意提供一些替代解决方案来使用函数式编程和Elixir构造从列表(X)中删除重复值吗 X = [1,26,3,40,5,6,6,7] # the 6 being the duplicate 在我看来,解决这个问题的基本解决方案是迭代列表(X),然后添加到一个新的列表(Y),其中键不存在 谢谢你Enum。uniq做你想做的事,例如: iex(6)> Enum.uniq([1,26,3,40,5,6,6,7]) [1, 26, 3, 40, 5, 6, 7] 就如何实现它而言,您可以编

有人愿意提供一些替代解决方案来使用函数式编程和Elixir构造从列表(X)中删除重复值吗

X = [1,26,3,40,5,6,6,7] # the 6 being the duplicate
在我看来,解决这个问题的基本解决方案是迭代列表(X),然后添加到一个新的列表(Y),其中键不存在


谢谢你

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]

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

[1, 1, 2, 3, 4, 2, 1] |> Enum.into(HashSet.new) #HashSet<[2, 3, 4, 1]>
[1,1,2,3,4,2,1]|>Enum.into(HashSet.new)#HashSet
也使用地图集

“3 3 2 1 1”|>String.split |>MapSet.new |>Enum.to_列表

==>
[“1”、“2”、“3”]

这是一个广泛研究的元素区分问题。我们知道在某些配置下问题的下界。它可以通过排序+迭代在O(nlogn)中求解,或者使用散列集在平均时间+空间上求解O(n)。链接的问题讨论了这个问题。@amit正确,谢谢-我相信我在寻找一种使用Elixir语言构造和函数式编程解决问题的有效方法。@amit,我不认为这是重复的。他在用一种特定的语言寻求答案,而你建议他重复的问题是一个关于算法复杂性的问题。不完全一样。在回答你的问题@DaneBalia时,Elixir中有一个内置函数,可以完成你想要的任务。Enum.uniq将从集合中删除重复的项。@Onriocatenacci谢谢-正是我要找的,不需要代码;)很好的建议,尽管HashSet已经被弃用,取而代之的是MapSet。