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