如何使用 Map 实现字典

Geo*_*... 0 dictionary list elixir

我正在尝试实现一个字典,但 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
Run Code Online (Sandbox Code Playgroud)

Bre*_*tty 7

长生不老药做变量范围的方式,你不能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)
Run Code Online (Sandbox Code Playgroud)

您还可以使用Map.update/4来改进您的减速机。

dict = Enum.reduce(array, %{}, fn item, dict -> Map.update(dict, item, 1, &(&1 + 1)) end)
Run Code Online (Sandbox Code Playgroud)

但实际上从 Elixir 1.10 开始就有一个内置函数Enum.frequencies/1

dict = Enum.frequencies(array)
Run Code Online (Sandbox Code Playgroud)

  • `Enum.frequencies/1`,很好。[实现](https://github.com/elixir-lang/elixir/blob/v1.11.0/lib/elixir/lib/enum.ex#L1127)也值得检查。 (2认同)