如何使用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以来,有一个内置函数,Enum.frequencies/1。

dict = Enum.frequencies(array)

最新更新