Эликсир MapSet против Enum.member? - PullRequest
3 голосов
/ 27 марта 2019

Мне нужно сохранить только уникальные значения, и я не понимаю, какую структуру данных мне следует использовать. Позже я буду читать только всю структуру данных.

  • Один из способов - использовать MapSet, который будет содержать только уникальные элементы.
  • Второй подход состоит в том, чтобы каждый раз проверять с помощью Enum.member?, существует ли уже элемент, но я могу легко гарантировать, что с помощью MapSet.

Я не уверен, какой подход лучше использовать в таком сценарии. Что является более эффективным, а какое - лучшей практикой?

Ответы [ 3 ]

4 голосов
/ 27 марта 2019

Если вы храните свои данные в MapSet, то Enum.member? фактически вызовет MapSet.member?, поэтому вы будете иметь все преимущества MapSet. Вы можете увидеть соответствующую реализацию протокола здесь .

1 голос
/ 27 марта 2019

Я думаю, что вы путаете структуры данных и протоколы .MapSet - это структура данных (и модуль), которая реализует протокол Enumerable.Вы можете вызвать Enum.member/2 на MapSet, но это не обязательно:

mapset =
  MapSet.new()
  |> MapSet.put(1)
  |> MapSet.put(2)
  |> MapSet.put(2)
  |> MapSet.put(3)
  |> MapSet.put(3)
  |> MapSet.put(3)

Enum.join(mapset, ",")

Выход:

"1,2,3"
0 голосов
/ 28 марта 2019

Если у вас уже есть структура данных с дубликатами, используйте Enum.uniq / 1 .

Пример:

[1, 1, 2, 2, 2, 3, 4] |> Enum.uniq

Результат:

[1, 2, 3, 4]
...