Эликсир Удалить дубликаты из списка
Кто-нибудь захочет предоставить альтернативное решение для удаления повторяющихся значений из списка (X) с использованием функционального программирования и эликсирных конструкций?
X = [1,26,3,40,5,6,6,7] # the 6 being the duplicate
Решающее решение для решения этой проблемы состояло в том, чтобы перебирать список (X) и добавлять в новый список (Y), где ключ еще не существует.
Спасибо
Ответы
Ответ 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" ]