【问题标题】:Lua Table - Search for Items that starts with an LetterLua Table - 搜索以字母开头的项目
【发布时间】:2021-06-19 00:13:07
【问题描述】:

我有这张桌子

    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”开头的条目以获得相同的结果?

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

【问题讨论】:

    标签: lua lua-table


    【解决方案1】:

    首先:表 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]
    ...如果您的动物中有牛、乌鸦、青蛙和鱼,请使用多个字母。

    __index 中的函数名称为 find 的示例

    >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
    

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

    【讨论】:

    • vk 在你的循环定义中是倒退的。 v 通常用于valuek 用于key
    • 是的,你是对的 - 懒惰让我这样做而不是可读和可理解的单词 - 我为以下读者更正 - 感谢您的提示
    【解决方案2】:

    停止,我发现了一个问题......

    看这里 - 我更喜欢第一个解决方案:

    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 v,k in pairs(tab) do
    if k.sname:find(args[1],1) then print(v,'=',k.sname) end
    end
    end})
    
    
    -- Search Entries with Start U.....
    -- there should be no result, but....
    animals('u')
    

    我得到结果: 1 = 兔子 2 = 鼠标

    这不应该是结果!

    【讨论】:

    • 阅读我的两个示例之间的文本并尝试第二个示例 - 魔术是通过模式构造完成的
    • ^ 可以在 find 函数中硬编码,也可以作为参数提供。第二种情况让第一个示例使用:animals('^o') - 输出当然什么都没有 - 也可以尝试^%l 小写字母和^%u 大写字母
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 2021-08-14
    • 2022-07-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    相关资源
    最近更新 更多