如何在Lua中检查表中是否包含元素?

有没有一种方法可以检查表格中是否包含某个值?我有自己的(天真的)函数,但我想知道是否存在某些“官方”的方法?或者其他更有效的方法...

function table.contains(table, element)
  for _, value in pairs(table) do
    if value == element then
      return true
    end
  end
  return false
end

顺便说一下,我使用这个函数的主要原因是将表格用作集合,即不含重复元素。还有其他我可以使用的东西吗?

原文链接 https://stackoverflow.com/questions/2282444

点赞
stackoverflow用户213098
stackoverflow用户213098

我想不到其他比较值的方法,但是如果你使用集合的元素作为键,可以将值设为除nil以外的任何值。这样,您就可以快速查找而无需搜索整个表。

2010-02-17 16:43:37
stackoverflow用户189205
stackoverflow用户189205

你可以将值作为表的键。例如:

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

这里有一个更全面的示例链接

2010-02-17 16:44:03
stackoverflow用户41661
stackoverflow用户41661

根据你的表示,你的函数已经达到了最高效的程度。当然,正如其他人所指出的(以及在比 Lua 更早的语言中所实践的),解决你实际问题的方法是改变表示方式。当你有表格,而你想要集合时,你可以通过将设置元素作为键和“true”作为值来将表格转换为集合。+1 给 interjay。

2010-02-17 17:17:06
stackoverflow用户2739276
stackoverflow用户2739276

我知道这是一个旧帖子,但我想为后世添加一些东西。 解决你所遇到的问题的简单方法是创建另一个值到键的表。

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

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”。这可以避免需要遍历另一个表中的每个值。

如果事实证明你实际上无法将“element”用作键,因为它不是字符串,例如,则可以添加校验和或tostring,然后将其用作键。

为什么要这样做?如果你的表非常大,则遍历每个元素的时间将是显著的,从而阻止你经常执行操作。额外的内存开销将相对较小,因为它将存储指向相同对象的两个指针,而不是相同对象的两个副本。 如果你的表非常小,那么这将不太重要,事实上,遍历可能甚至比进行另一个映射查找更快。

但问题的措辞强烈暗示你有非常多的项目要处理。

2013-09-02 09:15:40
stackoverflow用户7087037
stackoverflow用户7087037
-- 在某个帮助函数模块中
function utils_Set(list)
    local set = {}
    for _, l in ipairs(list) do set[l] = true end
    return set
end

-- 在你的表格中
long_table = { "v1", "v2", "v1000"}

-- 查询某个值
_set = utils_Set(long_table)
if _set["v1"] then print("是的!") end
2021-03-18 21:50:59