我必须创建一个函数来计算列表中所有重复元素的数量,并将所述元素(以及它们的频率)添加到Map中。假设我的列表是:我的Map必须看起来像:#{rojo =〉2,verde =〉1,阿苏尔=〉1}我已经尝试了相当长的一段时间了,现在我无法拿出一个解决方案。
wvt8vs2t1#
结合@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, #{}).
qxgroojn2#
一个简单的方法是使用一个map,通过这样做,你可以遍历列表,检查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, #{}).
lqfhib0f3#
答案与@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}
只是为了好玩的乐趣。rorra回答适合更好的时候开始与Erlang。
3条答案
按热度按时间wvt8vs2t1#
结合@rorra和@Pascal解决方案...
qxgroojn2#
一个简单的方法是使用一个map,通过这样做,你可以遍历列表,检查map是否有正在处理的键,如果没有,你用值1来创建它,否则你通过添加1来更新它。
lqfhib0f3#
答案与@rorra相同,但使用了Erlang库和匿名函数:
只是为了好玩的乐趣。rorra回答适合更好的时候开始与Erlang。