Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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,我有以下物品清单 [{id,user1,category1},{id,user2,category1},{id,user1,category2}……, 其中id是唯一的,用户/类别可以重复。我正在试图找出如何从列表中获取统计数据,例如 [{user1,category1,20},{user1,category2,30}..]您可以使用lists:foldl/3函数来完成 F = fun({_,User,Cat},Accumulator) -> N = maps:get({

我有以下物品清单
[{id,user1,category1},{id,user2,category1},{id,user1,category2}……,
其中id是唯一的,用户/类别可以重复。我正在试图找出如何从列表中获取统计数据,例如


[{user1,category1,20},{user1,category2,30}..]

您可以使用lists:foldl/3函数来完成

F = fun({_,User,Cat},Accumulator) -> 
        N = maps:get({User,Cat},Accumulator,0),
        maps:put({User,Cat},N+1,Accumulator) end.
CountMap = lists:foldl(F,#{},InputListe),
这将返回一个映射,其形式为
{{user1,category1}=>20,{user1,category2}=>30…}

如果确实需要列表,则必须变换地图:

CountList = maps:fold(fun({User,Cat}, Count, Acc) -> [{User,Cat,Count}|Acc] end,[],CountMap).
我使用了中间映射,因为如果输入列表很大,那么与直接在输出列表中工作的解决方案相比,它提供了快速访问和快速更新。检索列表中的信息(平均解析列表的一半)要花费很多,修改它(平均复制列表的一半)也要花费很多

对于20万个元素的输入列表,在我的笔记本电脑上生成地图并将其转换为列表需要94毫秒,对于50万个元素需要219毫秒。

虽然这是一个很好的通用解决方案,但对于小型数据集(如多达15000个),您可以使用
列表:排序/1
使用此版本,这对它们来说要快得多

main(L) ->
    count(lists:sort(transform(L))).

count([]) -> [];
count([H|T]) ->
    count(H, T, 1, []).

count(H, [H|T], N, Acc) -> count(H, T, N+1, Acc);
count({U, C}, [H|T], N, Acc) -> count(H, T, 1, [{U, C, N}|Acc]);
count({U, C}, [], N, Acc) -> [{U, C, N}|Acc].

transform(L) ->
    transform(L, []).

transform([], Acc) -> Acc;
transform([{_, User, Category}|T], Acc) ->
    transform(T, [{User, Category}|Acc]).
编辑

决定哪种算法更快的关键点是唯一键的比例。如果数据集很大,但唯一的
{User,Category}
数量较少,则使用映射的解决方案会更快。反之,
列表:排序/1
会更快。换句话说,列表与映射的大小很重要