【问题标题】:Map with record as key - how to check if key exists in Erlang以记录为键的映射 - 如何检查 Erlang 中是否存在键
【发布时间】:2019-08-22 20:45:36
【问题描述】:

我想制作一个地图,它有一个记录作为键和列表作为一个值,但是我在检查是否已经存在类似的键时遇到了问题 - 或者我不知道如何使它工作二郎。

我有一个包含三个值的记录,我需要检查映射中是否有至少一个值相等的键。

我是这么看的:

-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 中不起作用。

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

【问题讨论】:

    标签: erlang maps record


    【解决方案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:内存更少,如果找到合适的密钥可以提前停止。但是代码会复杂得多。

    【讨论】:

      猜你喜欢
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      相关资源
      最近更新 更多