erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

61 行
1.5 KiB

-module(utMapsFold).
-export([fold/1, diff/2, diffKeys/2]).
fold(Map) ->
fold(maps:iterator(Map), []).
fold(Iterator, AccList) ->
case maps:next(Iterator) of
{Key, Value, NextIter} ->
fold(NextIter, [{Key, Value} | AccList]);
none ->
AccList
end.
diff(Map1, Map2) ->
case map_size(Map1) =< map_size(Map2) of
true ->
diff_1(maps:next(maps:iterator(Map1)), Map1, Map2);
_ ->
diff_2(maps:next(maps:iterator(Map2)), Map1)
end.
diff_1(none, Map1, _Map2) ->
Map1;
diff_1({Key, _Value, NextIter}, Map1, Map2) ->
case maps:is_key(Key, Map2) of
true ->
diff_1(maps:next(NextIter), maps:remove(Key, Map1), Map2);
_ ->
diff_1(maps:next(NextIter), Map1, Map2)
end.
diff_2(none, Map1) ->
Map1;
diff_2({Key, _Value, NextIter}, Map1) ->
diff_2(maps:next(NextIter), maps:remove(Key, Map1)).
diffKeys(Map1, Map2) ->
case map_size(Map1) =< map_size(Map2) of
true ->
diffKeys_1(maps:next(maps:iterator(Map1)), Map2, []);
_ ->
diffKeys_2(maps:next(maps:iterator(Map2)), Map1)
end.
diffKeys_1(none, _Map2, Acc) ->
Acc;
diffKeys_1({Key, _Value, NextIter}, Map2, Acc) ->
case maps:is_key(Key, Map2) of
true ->
diffKeys_1(maps:next(NextIter), Map2, Acc);
_ ->
diffKeys_1(maps:next(NextIter), Map2, [Key | Acc])
end.
diffKeys_2(none, Map1) ->
maps:to_list(Map1);
diffKeys_2({Key, _Value, NextIter}, Map1) ->
diffKeys_2(maps:next(NextIter), maps:remove(Key, Map1)).