Как реализовать словарь с помощью карты

#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 , приятно. Реализацию тоже стоит проверить.