我知道这是一个旧帖子,但我想为后代添加一些东西。处理您遇到的问题的简单方法是制作另一个表,该表具有键值。
IE。您有 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 个副本。如果您的表非常小,那么它的重要性就会小得多,事实上,迭代甚至可能比另一个地图查找更快。
然而,问题的措辞强烈表明您有大量的项目要处理。