Как проверить, содержит ли таблица элемент в Lua?

Существует ли метод для проверки, если таблица содержит значение? У меня есть своя собственная (наивная) функция, но я задавался вопросом, существует ли что-то "официальное" для этого? Или что-то более эффективное...

function table.contains(table, element)
  for _, value in pairs(table) do
    if value == element then
      return true
    end
  end
  return false
end

Между прочим, главная причина, я использую это, функционирует, должен использовать таблицы в качестве наборов, т.е. без дублирующихся элементов. Есть ли что-то еще, что я мог использовать?

90
задан hjpotter92 20 April 2013 в 09:33
поделиться

3 ответа

Вы можете поместить значения в качестве ключей таблицы. Например:

function addToSet(set, key)
    set[key] = true
end

function removeFromSet(set, key)
    set[key] = nil
end

function setContains(set, key)
    return set[key] ~= nil
end

Есть более полнофункциональный пример здесь.

114
ответ дан 24 November 2019 в 07:05
поделиться

Я не могу придумать другого способа сравнения значений, но если вы используете элемент множества в качестве ключа, вы можете установить значение на что угодно, кроме nil. Тогда вы получите быстрый поиск без необходимости искать во всей таблице.

2
ответ дан 24 November 2019 в 07:05
поделиться

Учитывая ваше представление, ваша функция настолько эффективна, насколько это возможно. Конечно, как отмечали другие (и практикуется на языках старше Lua), решение вашей реальной проблемы - изменить представление. Когда у вас есть таблицы и вам нужны наборы, вы превращаете таблицы в наборы, используя элемент set в качестве ключа и true в качестве значения. +1 к интерджаю.

24
ответ дан 24 November 2019 в 07:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: