我想制作一个映射,该映射具有作为键的记录和作为值的列表,但是我在检查是否已经存在类似的键时遇到了问题-或更确切地说,我不知道如何使它工作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中不起作用。
您是否知道如何检查(可能很容易)?
答案 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
:更少的内存,如果找到合适的密钥,可以提前停止。但是代码会复杂得多。