Sé que esta es una publicación anterior, pero quería agregar algo para la posteridad. La forma simple de manejar el problema que tiene es hacer otra tabla, de valor para la clave.
es decir. tienes 2 tablas que tienen el mismo valor, una apuntando en una dirección, una apuntando en 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 la clave 'elemento'. Esto evita la necesidad de iterar a través de cada valor de la otra tabla.
Si resulta que no puede usar el 'elemento' como clave, porque no es una cadena, por ejemplo, agregue una suma de comprobación o 'toString' en ella, por ejemplo, y luego use eso como llave.
¿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 para el mismo objeto, en lugar de 2 copias del mismo objeto. Si sus tablas son muy pequeñas, importará mucho menos, de hecho puede incluso ser más rápido iterar que tener otra búsqueda en el mapa.
La redacción de la pregunta, sin embargo, sugiere fuertemente que tiene una gran cantidad de elementos para tratar.
¿Qué significa la _, notación? – Martin
Es simplemente una variable "basura" llamada '_'. 'pairs()' devuelve 'key, value', pero en este ejemplo solo necesito el valor. Es una especie de convención (adoptada en el libro "Programación en Lua" http://www.lua.org/pil/index.html) para usar esta variable '_' para almacenar cosas que no necesita. – Wookai