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