首页 > 解决方案 > Lua Table - 搜索以字母开头的项目

问题描述

我有这张桌子

    animals = {
     {sname = "bunny", name = "bunny hase", size = 4, size2 = 8, size3 = 9},
     {sname = "mouse", name = "Micky Mouse", size = 1, size2 = 12, size3 = 22},
     {sname = "cow", name = "Die Kuh", size = 30, size2 = 33, size3 = 324
}

在那里我可以通过列出的条目进行搜索

for _,v in pairs(animals) do
  if v.sname == "bunny" then
    print(v.sname, v.name, v.size, v.size2, v.size3)
    break
  end
end

并得到结果:

bunny   bunny hase  4   8   9

现在我想从一个字母开始在我的表中搜索,例如“b”,它显示所有以字母“b”开头的条目以获得相同的结果?

我没有找到解决方案。你能帮帮我吗?

标签: lualua-table

解决方案


第一:表格animals需要一个尾随};-)

将它放在Lua -i控制台中并玩弄...

>animals = {                                   
     {sname = "bunny", name = "bunny hase", size = 4, size2 = 8, size3 = 9},
     {sname = "mouse", name = "Micky Mouse", size = 1, size2 = 12, size3 = 22},
     {sname = "cow", name = "Die Kuh", size = 30, size2 = 33, size3 = 324}
}
-- Now set a __call metamethod on same table
>setmetatable(animals,{__call=function(tab,...)
local args={...}
for key, value in pairs(tab) do
if value.sname:find(args[1],1) then print(key,'=',value.sname) end
end
end})
table: 0x565c4a00
-- Lets try it once
>animals('b')                                  
1    =    bunny
-- Next one
>animals('c')
3    =    cow
-- Last one
>animals('m')
2    =    mouse

使用元表将你的东西放在一起。
另一个不错的地方是元__index方法,它可以保存该表所需的所有函数,并且可以像字符串上的字符串函数一样使用。
(喜欢:)value.sname:find(args[1],1)
导致了 find 应该做什么的核心。
在第一个示例中,它整体sname查找匹配模式。
检查 Lua 模式也有什么用处。
也许^只是一开始听起来很聪明?
因此,构建查找模式:'^'..args[1]
...如果您的动物中有牛、乌鸦、青蛙和鱼,请使用多个字母。

find带有函数名称的示例__index

>animals = {                                   
     {sname = "bunny", name = "bunny hase", size = 4, size2 = 8, size3 = 9},
     {sname = "mouse", name = "Micky Mouse", size = 1, size2 = 12, size3 = 22},
     {sname = "cow", name = "Die Kuh", size = 30, size2 = 33, size3 = 324}
}
-- Place a find function into __index
>setmetatable(animals,{__index={find=function(tab,...)
local args={...}
for key, value in pairs(tab) do
if value.sname:find('^'..args[1]) then print(key,'=',value.sname) end
end
end}})
table: 0x565c3db0
-- first
>animals:find('c')                                
3       =       cow
-- next
>animals:find('m')
2       =       mouse
-- last
>animals:find('b')
1       =       bunny

如果您想打印所有键值,请扩展print()in find()


推荐阅读