Я знаю, что это старый пост, но я хотел добавить что-то для потомков. Простой способ справиться с проблемой, которую у вас есть, - сделать другую таблицу с ключом.
ie. у вас есть 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
Затем вы можете запросить новую таблицу, чтобы узнать, есть ли у нее ключ «элемент». Это предотвращает необходимость повторения каждого значения другой таблицы.
Если окажется, что вы не можете использовать «элемент» в качестве ключа, потому что это не строка, например, добавьте к ней контрольную сумму или «toString», а затем используйте это как ключ.
Зачем вы хотите это сделать? Если ваши таблицы очень большие, количество времени для итерации по каждому элементу будет значительным, что мешает вам делать это очень часто. Дополнительные служебные данные памяти будут относительно небольшими, так как они будут хранить 2 указателя на один и тот же объект, а не 2 копии одного и того же объекта. Если ваши таблицы очень маленькие, то это будет иметь гораздо меньшее значение, даже если он будет быстрее итерации, чем для поиска другой карты.
Формулировка вопроса, однако, настоятельно указывает на то, что у вас есть большое количество предметов для решения.
Что означает обозначение _, обозначение? – Martin
Это просто переменная «мусор» с именем '_'. 'pairs()' возвращает 'key, value', но в этом примере мне нужно только значение. Это своего рода соглашение (принятое в книге «Программирование в Lua» http://www.lua.org/pil/index.html), чтобы использовать эту переменную '_' для хранения вещей, которые вам не нужны. – Wookai