如何使用 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)
我正在尝试实现一个字典,但是 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)