#list #dictionary #elixir
#Список #словарь #эликсир
Вопрос:
Я пытаюсь реализовать словарь, но функция Map.put не добавляет новый элемент на карту, вместо этого она выдает мне новую карту с последним (ключ, значение} вставлено Я также пробовал Map.put_new это не сработало
def someFunction(array) do
dict = %{}
Enum.each(array, fn item ->
if (Map.has_key?(dict, item)) do
dict = %{dict | item => (dict[item] 1)}
else
dict = Map.put(dict , item, 1)
end
end)
end
Ответ №1:
То, как elixir выполняет переменные области, вы не можете установить dict
изнутри вашего Enum.each/2
. Вместо этого вам нужно передать dict
его как накопитель при перечислении array
.
dict =
Enum.reduce(array, %{}, fn item, dict ->
if (Map.has_key?(dict, item)) do
%{dict | item => (dict[item] 1)}
else
Map.put(dict , item, 1)
end
end)
Вы также можете использовать Map.update/4
для улучшения своего редуктора.
dict = Enum.reduce(array, %{}, fn item, dict -> Map.update(dict, item, 1, amp;(amp;1 1)) end)
Но на самом деле есть встроенная функция, начиная с Elixir 1.10, Enum.frequencies/1.
dict = Enum.frequencies(array)
Комментарии:
1.
Enum.frequencies/1
, приятно. Реализацию тоже стоит проверить.