【问题标题】:Lua search through tableLua通过表搜索
【发布时间】:2026-01-23 13:10:02
【问题描述】:

我正在使用 Corona SDK 开发一个游戏项目,但遇到了问题。我正在尝试在 for 循环中使用 string.find() 来测试以确定某个值是否在某个表中,如果是,则将该值添加到另一个表中。我的问题是,由于在这种情况下 string.find()/string.match 不会读取重复项(假设 for 循环是原因)。在“复制”表中,我基本上只有“1102”、“1103”而不是“1102”、“1102”、“1103”、“1102”,这就是我试图做到这一点的方式。有什么建议吗?

database = 
{
 {name="test", serial="1102", img="src/1.png"},
 {name="test2", serial="1103", img="src/2.png"},
 {name="test3", serial="1104", img="src/3.png"}
}

list = 
{
 "1102",
 "1102",
 "1103",
 "1102"
}

copy = {}
n=1

for i=1, #database do
 if string.find(database[i].serial, tostring(list[n])) then 
   table.insert(copy, database[i].img)
   n=n+1
 end
end    
for i=1, #copy do 
    print(copy[i])
end

【问题讨论】:

  • tostring(list[n]) 中的n 是什么?如果serial 匹配list 中的任何 个值或特定值,您想匹配database 中的值吗? list 中的重复元素是什么意思?
  • 意味着添加 n=1,因此每个查找都是 n=n+1 以转到下一个索引。基本上我要做的是将“列表”中的序列与“数据库”匹配,每次匹配时,将 img 值添加到“复制”表中。最重要的是,即使对于像 3 个“1102”连续剧这样的重复,我也需要它这样做,按照“列表”中出现的顺序。然后使用复制表绘制图像,甚至复制。我无法弄清楚这一点。我正在考虑一个 for 循环,但我不知道该怎么做。
  • 通过您的示例输入,您希望copy 有一个"src/1.png" 和一个"src/2.png",这是正确的吗?
  • 代码读作:src/1.png, src/2.png 然而,它需要读作src/1.png, src/1.png, src/3.png, src/1.png遵循“列表”的设置方式。
  • 我不知道如何以这种方式遍历表格,直到 list 将其所有 img 放入 copy

标签: lua coronasdk lua-table


【解决方案1】:

使用嵌套循环是可行的。

for lk, lv in ipairs(list) do
  for dk, dv in ipairs(database) do
    if string.find(dv.serial, tostring(lv)) then 
      table.insert(copy, dv.img)
    end
  end
end

我使用的是ipairs,类似于for i=1, #list do

【讨论】:

    【解决方案2】:

    数据库表中的连续剧是唯一的吗?如果是这样,从代码中,我认为你可以让你的数据库表更有效率。

    local database = 
    {
     [1102] = {name="test", img="src/1.png"},
     [1103] = {name="test2", img="src/2.png"},
     [1104] = {name="test3", img="src/3.png"}
    }
    

    请注意,通过此更改,您无法使用迭代 for 循环在数据库表中导航。但是,您进行检查的部分变为:

    local list = {1102,1102,1103,1102,}
    local copy = {};
    for index, serial in next, list do 
        if database[serial] then copy[#copy+1] = database[serial].img end
    end
    

    对于最后一部分,您可以使用table.concat() 将表的值打印为字符串,而不是逐个迭代:

    table.concat(copy, "\n")
    

    最后,我知道你写的代码有一个例子,但要小心全局变量;我希望它们(数据库、列表、副本)在您的代码中不是全局的。总之,

    问候,lyr

    【讨论】:

    • 然后你可以将这些序列号作为数据库表中的键;如上图所示。