Карта с записью в качестве ключа - как проверить, существует ли ключ в Erlang - PullRequest
1 голос
/ 01 апреля 2019

Я хотел бы создать карту, в которой в качестве ключа используется запись, а в качестве значения указан список, но у меня возникла проблема с проверкой, существует ли подобный ключ, или, скорее, я не знаю, как заставить его работать в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.

Моя идея состояла в том, чтобы указать _ как «любое значение» на картах: is_key, но это не работает в Erlang.

У вас есть идеи, как это проверить (возможно, легко)

1 Ответ

2 голосов
/ 01 апреля 2019

Ну, нет особенно дешевого способа сделать это.Возможно, вам придется проверить все ключи карты.Простой способ -

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: меньше памяти и может рано остановиться, если вы найдете подходящий ключ.Но код будет значительно сложнее.

...