制作列表中重复元素的计数器并将其添加到MapERLANG

ahy6op9u  于 2022-12-08  发布在  Erlang
关注(0)|答案(3)|浏览(148)

我必须创建一个函数来计算列表中所有重复元素的数量,并将所述元素(以及它们的频率)添加到Map中。假设我的列表是:我的Map必须看起来像:#{rojo =〉2,verde =〉1,阿苏尔=〉1}我已经尝试了相当长的一段时间了,现在我无法拿出一个解决方案。

wvt8vs2t

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, #{}).
qxgroojn

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, #{}).
lqfhib0f

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。

相关问题