Eu sei que este é um post antigo, mas queria acrescentar algo para a posteridade. A maneira simples de lidar com o problema que você tem é fazer outra tabela, de valor para chave.
ie. você tem 2 tabelas com o mesmo valor, uma apontando para uma direção e uma apontando para a outra.
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
Você pode então consultar a nova tabela para ver se ela contém o 'elemento' chave. Isso evita a necessidade de iterar por todos os valores da outra tabela.
Se descobrir que você não pode realmente usar o 'elemento' como uma chave, porque não é uma string, por exemplo, adicione uma soma de verificação ou tostring
nela, por exemplo, e use-a como a chave.
Por que você quer fazer isso? Se suas tabelas forem muito grandes, a quantidade de tempo para iterar em cada elemento será significativa, impedindo que você faça isso com muita frequência. A sobrecarga de memória adicional será relativamente pequena, pois armazenará 2 ponteiros para o mesmo objeto, em vez de 2 cópias do mesmo objeto. Se suas tabelas forem muito pequenas, isso importará muito menos; na verdade, pode ser até mais rápido iterar do que ter outra pesquisa de mapa.
A formulação da pergunta, entretanto, sugere fortemente que você tem um grande número de itens para tratar.