是否有用于检查是否一个表包含一个值的方法?我有我自己的(幼稚)函数,但我想知道如果有什么“官”的存在是什么?什么更有效的...

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个拷贝。 如果你的表是非常小的,那么它会事少得多,事实上它甚至可能会更快迭代,而不是有另一个地图查找。

这个问题的措辞但是强烈建议您有大量的项目来处理。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top