Sé que esta es una publicación antigua, pero quería agregar algo para la posteridad. La forma sencilla de manejar el problema que tiene es hacer otra tabla, de valor a clave.
es decir. tienes 2 tablas que tienen el mismo valor, una apuntando en una dirección y otra apuntando a la otra.
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
A continuación, puede consultar la nueva tabla para ver si tiene el 'elemento' clave. Esto evita la necesidad de iterar a través de cada valor de la otra tabla.
Si resulta que en realidad no puede usar el 'elemento' como clave, porque no es una cadena, por ejemplo, agregue una suma de verificación o tostring
en él, por ejemplo, y luego utilícelo como clave.
¿Por qué quieres hacer esto? Si sus tablas son muy grandes, la cantidad de tiempo para iterar a través de cada elemento será significativa, lo que le impedirá hacerlo con mucha frecuencia. La sobrecarga de memoria adicional será relativamente pequeña, ya que almacenará 2 punteros al mismo objeto, en lugar de 2 copias del mismo objeto. Si sus tablas son muy pequeñas, entonces importará mucho menos, de hecho, puede ser incluso más rápido iterar que tener otra búsqueda de mapa.
Sin embargo, la redacción de la pregunta sugiere fuertemente que tiene una gran cantidad de temas de los que ocuparse.