以记录作为键的映射-如何检查Erlang中是否存在键

以记录作为键的映射-如何检查Erlang中是否存在键,erlang,maps,record,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 = _,

我想制作一个映射,其中记录作为键,列表作为值,但是我在检查类似的键是否已经存在时遇到了问题——或者更确切地说,我不知道如何在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.
我的想法是在地图中给u作为“任何值”:is_u键,但这在Erlang中不起作用


你知道如何检查它吗(可能很容易)?

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

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'

更便宜的方法是使用:内存更少,如果找到合适的钥匙,可以提前停止。但代码将要复杂得多