以记录为键的映射 - 如何检查 Erlang 中是否存在键
Map with record as key - how to check if key exists in Erlang
我想制作一张地图,其中记录作为键,列表作为值,但我在检查是否已存在类似键时遇到问题 - 或者更确切地说,我不知道如何制作它在 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 中将 _ 作为 "any value",但这在 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 工作。
我有一个包含三个值的记录,我需要检查映射中是否有至少一个值相等的键。
我是这样看的:
-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 中将 _ 作为 "any value",但这在 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
:内存更少,如果找到合适的密钥可以提前停止。但是代码会复杂得多。