制作列表中重复元素的计数器并将其添加到地图 ERLANG
Making a counter of repeating elements in a list and add it to a map ERLANG
我必须创建一个函数来计算列表中的所有重复元素,并将所述元素(以及它们出现的频率)添加到地图中。
假设我的清单是:[rojo, verde, rojo, azul]
我的地图必须看起来像:#{rojo => 2, verde => 1, azul => 1}
我已经尝试了一段时间了,我无法想出解决方案。
一个简单的方法是使用map,通过这样做,你可以遍历列表,检查地图是否有正在处理的键,如果没有它,您使用值 1 创建它,否则您通过添加 1 来更新它。
freq([], Map) ->
Map;
freq([H|T], Map) ->
NewMap = case maps:find(H, Map) of
{ok, Value} -> Map#{H := Value + 1};
_ -> Map#{H => 1}
end,
freq(T, NewMap).
List = [rojo, verde, rojo, azul],
freq(List, #{}).
与@rorra 相同的答案,但使用了 erlang 库和匿名函数:
1> List = [rojo, verde, rojo, azul].
[rojo,verde,rojo,azul]
2> Freq = fun(InputList) ->
2> lists:foldl(fun(Item,Acc)->
2> Inc = fun(Count)-> Count+1 end,
2> maps:update_with(Item,Inc,1,Acc)
2> end,
2> #{},InputList)
2> end.
#Fun<erl_eval.44.79398840>
3> Freq(List).
#{azul => 1,rojo => 2,verde => 1}
纯属娱乐。从 Erlang 开始时,rorra 答案更适合。
结合@rorra 和@Pascal 解决方案…
freq([], Map) ->
Map;
freq([H|T], Map) ->
freq(T, maps:update_with(H, fun inc/1, 1, Map)).
inc(X) -> X + 1.
test() ->
List = [rojo, verde, rojo, azul],
#{rojo := 2, verde := 1, azul := 1} =
freq(List, #{}).
我必须创建一个函数来计算列表中的所有重复元素,并将所述元素(以及它们出现的频率)添加到地图中。 假设我的清单是:[rojo, verde, rojo, azul] 我的地图必须看起来像:#{rojo => 2, verde => 1, azul => 1} 我已经尝试了一段时间了,我无法想出解决方案。
一个简单的方法是使用map,通过这样做,你可以遍历列表,检查地图是否有正在处理的键,如果没有它,您使用值 1 创建它,否则您通过添加 1 来更新它。
freq([], Map) ->
Map;
freq([H|T], Map) ->
NewMap = case maps:find(H, Map) of
{ok, Value} -> Map#{H := Value + 1};
_ -> Map#{H => 1}
end,
freq(T, NewMap).
List = [rojo, verde, rojo, azul],
freq(List, #{}).
与@rorra 相同的答案,但使用了 erlang 库和匿名函数:
1> List = [rojo, verde, rojo, azul].
[rojo,verde,rojo,azul]
2> Freq = fun(InputList) ->
2> lists:foldl(fun(Item,Acc)->
2> Inc = fun(Count)-> Count+1 end,
2> maps:update_with(Item,Inc,1,Acc)
2> end,
2> #{},InputList)
2> end.
#Fun<erl_eval.44.79398840>
3> Freq(List).
#{azul => 1,rojo => 2,verde => 1}
纯属娱乐。从 Erlang 开始时,rorra 答案更适合。
结合@rorra 和@Pascal 解决方案…
freq([], Map) ->
Map;
freq([H|T], Map) ->
freq(T, maps:update_with(H, fun inc/1, 1, Map)).
inc(X) -> X + 1.
test() ->
List = [rojo, verde, rojo, azul],
#{rojo := 2, verde := 1, azul := 1} =
freq(List, #{}).