【问题标题】:Erlang Maps : get keys that has the same valueErlang Maps:获取具有相同值的键
【发布时间】:2015-09-12 19:57:40
【问题描述】:

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

有什么想法可以实现吗?

【问题讨论】:

  • 调用函数时传入的参数是什么?
  • "H" 是值为 VV 的键;我想在“地图”中找到具有相同值“VV”的其他键
  • 您正在遍历整个地图,因此您最终将按下H 键。但是你的函数不处理那个键。

标签: erlang maps


【解决方案1】:

您传递给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).

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

【讨论】:

    【解决方案2】:

    对此也有列表理解解决方案:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多