Lua搜索表

时间:2015-06-04 07:01:37

标签: lua corona lua-table

我正在使用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

2 个答案:

答案 0 :(得分: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类似。

答案 1 :(得分:0)

数据库表中的序列号是唯一的吗?如果是这样,从代码中,我认为您可以使您的数据库表更有效。

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