如何使用 Map 实现字典

How to implement a dictionary using a Map

我正在尝试实现一个字典,但是 Map.put 函数没有将新元素添加到地图中,而是给我一个插入了最后一个 (key, value} 的新地图 我也试过了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

Elixir 处理变量作用域的方式,您不能从 Enum.each/2 内部设置 dict。相反,您需要做的是在枚举 array.

时将 dict 作为累加器传递
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, &(&1 + 1)) end)

但自 Elixir 1.10 以来实际上有一个 built-in 函数,Enum.frequencies/1

dict = Enum.frequencies(array)