Подтвердить что ты не робот

Эликсир Удалить дубликаты из списка

Кто-нибудь захочет предоставить альтернативное решение для удаления повторяющихся значений из списка (X) с использованием функционального программирования и эликсирных конструкций?

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

Решающее решение для решения этой проблемы состояло в том, чтобы перебирать список (X) и добавлять в новый список (Y), где ключ еще не существует.

Спасибо

4b9b3361

Ответ 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, 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]

Ответ 2

Еще одно возможное решение - использовать Set при создании коллекции:

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

Ответ 3

Также используя MapSet

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

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