【问题标题】:Check if array contains specific value检查数组是否包含特定值
【发布时间】:2016-02-04 06:59:21
【问题描述】:

我有这个数组,有一些值(int),我想检查用户给定的值是否等于该字符串中的值。如果是,则输出一条消息,例如“Got your string”。

列表示例:

local op = {
{19},
{18},
{17}
}

if 13 == (the values from that array) then
  message
else
  other message

如何做到这一点?

【问题讨论】:

  • 您是否打算让op 成为类似数组的表格包含 类似数组的表格,每个表格的第一个索引处都有数字,或者您正在寻找@987654323 @?

标签: lua lua-table


【解决方案1】:

Lua 不像其他语言那样有严格的数组——它只有哈希表。 Lua 中的表被认为是类数组,当它们的索引是数字的并且密集排列,不留空隙。下表中的索引为1, 2, 3, 4

local t = {'a', 'b', 'c', 'd'}

当你有一个类似数组的表时,你可以通过 循环 来检查它是否包含某个值。您可以使用for..in 循环和ipairs 函数来创建通用函数。

local function has_value (tab, val)
    for index, value in ipairs(tab) do
        if value == val then
            return true
        end
    end

    return false
end

我们可以在if 条件中使用上述内容来获得我们的结果。

if has_value(arr, 'b') then
    print 'Yep'
else
    print 'Nope'
end

重申我上面的评论,您当前的示例代码不是一个类似数组的数字表。相反,它是一个类数组表包含类数组表,它们的每个第一个索引中都有数字。您需要修改上面的函数以使用您显示的代码,使其不那么通用。

local function has_value (tab, val)
    for index, value in ipairs(tab) do
        -- We grab the first index of our sub-table instead
        if value[1] == val then
            return true
        end
    end

    return false
end

Lua 不是一个非常庞大或复杂的语言,它的语法非常清晰。如果上述概念对您来说完全陌生,您将需要花一些时间阅读真实的文献,而不仅仅是复制示例。我建议阅读Programming in Lua 以确保您了解基本知识。这是第一版,针对 Lua 5.1。

【讨论】:

    【解决方案2】:

    您还可以通过将值移动到索引并为其分配真实值来更有效地检查数组中是否存在该值。

    然后,当您检查表时,您只需检查该索引上是否存在值,这将为您节省一些时间,因为在最坏的情况下您不需要遍历整个表...

    这是我想到的例子:

    local op = {
    [19]=true,
    [18]=true,
    [17]=true
    }
    
    
    if op[19] == true then
      print("message")
    else
      print("other message")
    end
    

    【讨论】:

    • 不需要op[19] == true。那可以是op[19]
    【解决方案3】:

    你问题的表op实际上是一个数组的数组(表)。

    检查表中是否存在值:

    local function contains(table, val)
       for i=1,#table do
          if table[i] == val then 
             return true
          end
       end
       return false
    end
    
    local table = {1, 2, 3}
    if contains(table, 3) then
       print("Value found")
    end
    

    【讨论】:

    • 只有当表是一个 sequence 时才有效,在这种情况下就是这样。如果不是,请使用for k,v in pairs(table) do if k == val then return true end return false
    • 对。我认为您的评论需要进一步解释,特别是对于那些不熟悉 Lua 的人。在 Lua 中,表可以是哈希表(存储为稀疏数组)或数组(序列)。稀疏数组包含 nil。数组的长度计算为找到第一个 nil 之前的元素数。这意味着不可能迭代包含具有索引或 ipairs 的 nil 的数组。在这种情况下,有必要使用对。也就是说,如果您知道您的表是一个数组,那么最好使用 ipairs,因为对要慢得多。
    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2019-08-10
    • 2012-02-11
    相关资源
    最近更新 更多