如何检查一个表是否包含Lua中的一个元素?

有没有一种方法来检查表是否包含一个值? 我有我自己的(天真的)function,但我想知道是否有“官方”的东西存在? 或者更有效率的东西

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 

这里有一个更全面的例子。

给你的代表, 你的function是一样有效的,可以做。 当然,正如其他人所指出的那样(以及比Lua更早的语言),解决真正问题的办法就是改变代表性。 当你有表并且你想要集合时,你通过使用set元素作为关键字和true值作为表变成集。 +1到interjay。

我不能想到另一种比较值的方法,但是如果你使用集合的元素作为键,你可以将值设置为除nil以外的任何值。 然后,您可以快速查找,而无需search整个表格。

我知道这是一个旧post,但我想为后人添加一些东西。 处理您拥有的问题的简单方法是创build另一个表格,对于关键值。

即。 你有两个表格具有相同的值,一个指向一个方向,一个指向另一个。

 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 

然后,您可以查询新表,看它是否具有键“元素”。 这可以防止需要遍历另一个表的每个值。

如果事实certificate你不能实际使用“元素”作为键,因为它不是一个string,例如,然后添加一个校验和或“toString”,然后用它作为键。

你为什么要这样做? 如果你的表格非常大,遍历每一个元素的时间就会很长,这样你就无法经常这样做。 额外的内存开销将相对较小,因为它将存储2个指向同一对象的指针,而不是同一对象的2个副本。 如果你的表格非常小​​,那么重要性就会小很多,事实上,迭代的速度甚至可能会快于另一个地图查找。

这个问题的措辞强烈地表明,你有大量的项目要处理。