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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将记录作为键映射 - 如何检查Erlang中是否存在密钥相关的知识,希望对你有一定的参考价值。

我想创建一个映射,它有一个记录作为键,列表作为值,但我有一个问题,检查是否已存在类似的键 - 或者我不知道如何使它在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中不起作用。

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

答案

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

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

以上是关于将记录作为键映射 - 如何检查Erlang中是否存在密钥的主要内容,如果未能解决你的问题,请参考以下文章

检查 Presto 值映射中是不是存在键

如何检查不可变映射的所有键是不是都有值

Erlang判断记录是不是有字段

记录与映射组

如何在 Erlang 中进行内存映射 IO?

Erlang 记录与映射组