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

如何检查表中是否包含Lua中的元素?,lua,set,unique,contains,lua-table,Lua,Set,Unique,Contains,Lua Table,是否有方法检查表是否包含值?我有我自己的(天真的)功能,但我想知道是否有什么“官方”的存在?或者更有效的方法 function table.contains(table, element) for _, value in pairs(table) do if value == element then return true end end return false end 顺便说一下,我使用这个函数的主要原因是使用表作为集合,即没有重复的元素。还有什么

是否有方法检查表是否包含值?我有我自己的(天真的)功能,但我想知道是否有什么“官方”的存在?或者更有效的方法

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

顺便说一下,我使用这个函数的主要原因是使用表作为集合,即没有重复的元素。还有什么我可以使用的吗?

我想不出另一种比较值的方法,但如果使用集合的元素作为键,则可以将值设置为除nil以外的任何值。然后,您可以快速查找,而不必搜索整个表。

您可以将这些值作为表的键。例如:

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更古老的语言中所实践的),解决您真正问题的方法是改变表示法。当您有表格并且需要集合时,可以使用set元素作为键,使用
true
作为值,将表格转换为集合+1致interjay。

我知道这是一篇老文章,但我想为后代添加一些东西。 处理问题的简单方法是创建另一个表,该表的值与键有关

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

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
,然后将其用作键

你为什么要这样做?如果您的表非常大,那么遍历每个元素所需的时间将非常长,这会妨碍您经常这样做。额外的内存开销相对较小,因为它将存储指向同一对象的两个指针,而不是同一对象的两个副本。 如果您的表非常小,那么它的重要性就小得多,事实上,迭代可能比另一个映射查找更快


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

符号表示什么?它只是一个名为
\uu
的“垃圾”变量
pairs()
返回
key,value
,但在本例中,我只需要值。使用这个
变量来存储你不需要的东西是一种惯例(在《Lua编程》一书中采用)。我见过Python和JavaScript中使用的命名“垃圾”变量的惯例,也是。一位匿名用户建议对您的代码进行以下修复:如果具有指定键的集合中的值为FALSE,则函数setContains()返回FALSE,尽管表中存在具有指定键的项。行“return set[key]~=nil”修复了这个错误。可能还有
函数keysOfSet(set)local ret={}对于k,成对(set)do ret[#ret+1]=k end return ret end
这是一个很好的解释,但并没有真正为讨论添加任何内容。编辑interjay的答案可能是一个更好的主意。此外,“.key”应该在代码中的任何地方替换为“[key]”(与“value”相同),因为它不需要经常维护并行表。“官方”方法可能会在C中这样做,这会更快。但是如果像你说的那样,只在lua中进行,这是可能的最有效的方法!
-- in some helper module
function utils_Set(list)
    local set = {}
    for _, l in ipairs(list) do set[l] = true end
    return set
end

-- your table here
long_table = { "v1", "v2", "v1000"}

-- Consult some value
_set = utils_Set(long_table)
if _set["v1"] then print("yes!") end