如何检查是否表包含在Lua的元素?
题
是否有用于检查是否一个表包含一个值的方法?我有我自己的(幼稚)函数,但我想知道如果有什么“官”的存在是什么?什么更有效的...
function table.contains(table, element)
for _, value in pairs(table) do
if value == element then
return true
end
end
return false
end
顺便说,我使用这个功能的主要原因是使用表作为集,即没有重复的元素。有没有别的东西,我可以使用?
解决方案
您可以把值作为表的键。例如:
function addToSet(set, key)
set[key] = true
end
function removeFromSet(set, key)
set[key] = nil
end
function setContains(set, key)
return set[key] ~= nil
end
有一个更全功能例如此处。
其他提示
鉴于你的表现,您的功能是一样有效,可以做到的。当然,正如其他人指出(和实践语言比的Lua以上),将解决你真正的问题是改变表示。当你有表,你想套,通过使用一组元素作为重点和true
作为值转表成组。 1至interjay。
我想不出另一种方式来比较值,但是如果你使用集合的元素作为重点,可以将该值设置为无其他任何东西。然后你得到快速查找无需搜索整个表。
我知道这是一个古老的职位,但我想补充的东西给后人。 处理,你有这个问题最简单的方法就是让另一个表,有价值的关键。
即。你有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个拷贝。 如果你的表是非常小的,那么它会事少得多,事实上它甚至可能会更快迭代,而不是有另一个地图查找。
这个问题的措辞但是强烈建议您有大量的项目来处理。
不隶属于 StackOverflow