Erlang Maps:获取具有相同值的键

时间:2015-06-26 01:22:46

标签: erlang maps

我有一个{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”

有任何想法如何实现这个?

2 个答案:

答案 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).

此版本返回与HMap具有相同值的键列表。

答案 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 ].