将记录作为键映射 - 如何检查Erlang中是否存在密钥

问题描述 投票:0回答:1

我想创建一个映射,它有一个记录作为键,列表作为值,但我有一个问题,检查是否已存在类似的键 - 或者我不知道如何使它在Erlang中工作。

我有三个vales的记录,我需要检查地图中是否有一个至少有一个值相等的键。

我这样看:

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

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

你知道怎么检查它(可能很容易)吗?

erlang maps record
1个回答
1
投票

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

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:更少的内存,如果你找到合适的密钥可以提前停止。但代码会更加复杂。

© www.soinside.com 2019 - 2024. All rights reserved.