Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建列表中重复元素的计数器并将其添加到映射ERLANG_Erlang - Fatal编程技术网

创建列表中重复元素的计数器并将其添加到映射ERLANG

创建列表中重复元素的计数器并将其添加到映射ERLANG,erlang,Erlang,我必须创建一个函数来计算列表中所有重复的元素,并将所述元素(以及它们的频率)添加到地图中。 假设我的名单是:[罗霍,维德,罗霍,阿苏尔] 我的地图必须看起来像:{rojo=>2,verde=>1,azul=>1} 我已经尝试了很长一段时间,但我无法想出一个解决方案。一个简单的方法是使用a,然后通过这样做,您可以浏览列表,检查地图是否有正在处理的密钥,如果没有,您可以使用值1创建它,否则您可以通过添加1来更新它 freq([], Map) -> Map; freq([H|T], Ma

我必须创建一个函数来计算列表中所有重复的元素,并将所述元素(以及它们的频率)添加到地图中。 假设我的名单是:[罗霍,维德,罗霍,阿苏尔] 我的地图必须看起来像:{rojo=>2,verde=>1,azul=>1} 我已经尝试了很长一段时间,但我无法想出一个解决方案。

一个简单的方法是使用a,然后通过这样做,您可以浏览列表,检查地图是否有正在处理的密钥,如果没有,您可以使用值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}
1>列表=[rojo,verde,rojo,azul]。
[rojo、verde、rojo、azul]
2> Freq=fun(输入列表)->
2> 列表:foldl(乐趣(项目,Acc)->
2> Inc=乐趣(计数)->计数+1结束,
2> 地图:使用(附件1,Inc项目)更新
2> 完,,
2> #{},输入列表)
2> 结束。
#乐趣
3> 频率(列表)。
#{azul=>1,rojo=>2,verde=>1}

只是为了好玩。rorra答案从Erlang开始更适合。

结合@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, #{}).

请显示您已经尝试过的内容。如果您更喜欢模式匹配而不是函数调用,您也可以执行{H:=Value}的{code>case-Map:find(H,Map),而不是{ok,Value})谢谢你的回答!这三个都对解决这个问题很有帮助。