【问题标题】:Elixir Remove Duplicates From ListElixir 从列表中删除重复项
【发布时间】:2015-07-21 21:18:32
【问题描述】:

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

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

我认为解决这个问题的常用解决方案是迭代列表 (X),然后添加到一个新列表 (Y) 中,其中键不存在。

谢谢

【问题讨论】:

  • 这是元素区别问题,这是一个被广泛研究的问题。我们知道在某些配置下问题的下界。它可以通过排序 + 迭代在 O(nlogn) 中解决,或者通过使用哈希集在平均时间 + 空间上解决 O(n)。链接的问题讨论了这个问题。
  • @amit 正确的感谢 - 我相信我正在寻找一种使用 Elixir 语言构造和函数式编程解决问题的有效方法。
  • @amit,我不认为这是重复的。他要求使用特定语言的答案,而您建议他重复的问题是关于算法复杂性的问题。不完全一样。
  • 回答您的问题@DaneBalia,Elixir 中有一个内置函数可以满足您的需求。 elixir-lang.org/docs/v1.0/elixir/Enum.html#uniq/2 Enum.uniq 将从集合中删除重复项。
  • @OnorioCatenacci 谢谢你——正是我想要的,不需要代码;)

标签: elixir


【解决方案1】:

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]

【讨论】:

  • 好建议,尽管 HashSet 已被弃用,取而代之的是 MapSet。
【解决方案2】:

也使用 MapSet

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-09-30
      • 2011-01-13
      • 2021-04-02
      • 2016-01-28
      相关资源
      最近更新 更多