我有一个{H,VV}对,我想将这一对与Map的其余部分进行比较,以找到具有相同值的其他键。
我试过了:
check(H,Map)->
VV=maps:get(H,Map),
Fun = fun(K,V) when H =/= K, V=:=VV->
io:format("~p~p~n",[H,K])
end,
maps:map(Fun,Map).
它编译但引发错误“function_clause”
有任何想法如何实现这个?
答案 0 :(得分:3)
您传递给maps:map/2
的功能不会处理H
键,也不会处理任何不等于VV
的值。试试这个:
check(H,Map)->
VV=maps:get(H,Map),
Fun = fun(K,V) when H =/= K, V=:=VV->
io:format("~p:~p~n",[H,K]),
V;
(_,V) -> V
end,
maps:map(Fun,Map).
我认为你最好不要在这种情况下使用maps:fold/3
,因为你并没有尝试创建新地图,而只是想知道其他相同的密钥值为H
。考虑以下方法:
check(H, Map) ->
VV = maps:get(H,Map),
maps:fold(fun(K,V,Acc) when K /= H, V =:= VV ->
[K|Acc];
(_,_,Acc) ->
Acc
end, [], Map).
此版本返回与H
中Map
具有相同值的键列表。
答案 1 :(得分:1)
还有列表理解解决方案:
VV = maps:get(H,Map),
[ K || K <- maps:keys(Map), K =/= H, VV =:= maps:get(K, Map) ].
或者
VV = maps:get(H,Map),
[ K || {K, V} <- maps:to_list(Map), K =/= H, V =:= VV ].