使用记录作为键进行映射-如何检查Erlang中是否存在键

时间:2019-04-01 16:03:51

标签: erlang maps record

我想制作一个映射,该映射具有作为键的记录和作为值的列表,但是我在检查是否已经存在类似的键时遇到了问题-或更确切地说,我不知道如何使它工作Erlang。

我有一条带有三个价位的记录,我需要检查映射中是否有一个键至少具有一个相等的值。

我这样看:

-record(r, {A, B, C}).
addRecord(newA, newB, newC, Map) ->
  case maps:is_key(#r{A = newA, B = _, C = _}, Map) or maps:is_key(#r{A = _, B = newB, C = _}, Map) or maps:is_key(#r{A = _, B = _, C = newC}, Map) of
    true -> threo("...")
    _ -> maps:put(#r(A = newA, B = newB, C = newC), [], Map)
end.

我的想法是在maps:is_key中给_作为“任何值”,但这在Erlang中不起作用。

您是否知道如何检查(可能很容易)?

1 个答案:

答案 0 :(得分:2)

嗯,没有特别便宜的方法可以做到这一点。您可能需要检查所有地图键。简单的方法是

lists:any(fun(X) -> 
              is_record(X, r) andalso 
              (X#r.A == newA orElse X#r.B == newB orElse X#r.C == newC) 
          end, 
          maps:keys(Map))

(在您的示例中,我使用A等来简化比较,但是字段名必须是原子,因此它们应该是a'A')。

一种更便宜的方法是使用maps:iterator:更少的内存,如果找到合适的密钥,可以提前停止。但是代码会复杂得多。