我知道这是一个老帖子,但我想为后代添加一些东西。处理问题的简单方法是创建另一个有价值的表。
即。 你有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
然后,您可以查询新表以查看它是否具有键“元素”。 这可以防止需要遍历另一个表的每个值。
如果事实证明你实际上不能使用'element'作为键,因为它不是一个字符串,例如,然后在其上添加校验和或'toString',然后将其用作键。
你为什么要这样做? 如果您的表非常大,迭代每个元素的时间量将会非常大,从而使您无法经常执行此操作。 额外的内存开销相对较小,因为它将存储2个指向同一对象的指针,而不是相同对象的2个副本。如果你的表非常小,那么它就更不重要了,事实上迭代甚至比另一个地图查找更快。
然而,问题的措辞强烈暗示你有大量的项目需要处理。