Я знаю, что это старый пост, но я хотел добавить кое-что для потомков.
Простой способ справиться с возникшей проблемой - создать другую таблицу, имеющую значение для ключа.
т. у вас есть 2 таблицы с одинаковыми значениями, одна указывает на одно направление, одна указывает на другое.
function addValue(key, value)
if (value == nil) then
removeKey(key)
return
end
_primaryTable.key = value
_secodaryTable.value = key
end
function removeKey(key)
local value = _primaryTable.key
if (value == nil) then
return
end
_primaryTable.key = nil
_secondaryTable.value = nil
end
function getValue(key)
return _primaryTable.key
end
function containsValue(value)
return _secondaryTable.value ~= nil
end
Затем вы можете запросить новую таблицу, чтобы узнать, имеет ли она ключ 'element'. Это избавляет от необходимости перебирать каждое значение другой таблицы.
Если окажется, что вы не можете использовать «элемент» в качестве ключа, потому что это не строка, например, то добавьте к ней контрольную сумму или «toString», например, а затем используйте ее в качестве ключа .
Почему ты хочешь это сделать? Если ваши таблицы очень большие, количество времени для итерации каждого элемента будет значительным, что не позволит вам делать это очень часто. Дополнительная нагрузка на память будет относительно небольшой, поскольку в ней будет храниться 2 указателя на один и тот же объект, а не 2 копии одного и того же объекта.
Если ваши таблицы очень маленькие, то это будет иметь гораздо меньшее значение, так как, возможно, итерация будет быстрее, чем поиск другой карты.
Формулировка вопроса, однако, настоятельно предполагает, что у вас есть большое количество предметов для работы.