如何搜索Lua表中的值
2014-11-14 21:46:1
收藏:0
阅读:150
评论:2
我有一个项目需要在实际数据库不可能的环境中实现类似关系型数据库的结构。这个项目只能使用Lua这种编程语言,而Lua并不是我的强项。我已经创建了一个包含以下结构的表格:
table={
m:r={
x=1
y=1
displayName="Red"
}
m:y={
x=1
y=2
displayName="Yellow"
}
}
构建、存储和检索这个表格都很简单。但我遇到的问题是如何搜索表格。为使问题清晰,如果我可以使用SQL,我会这样做:
SELECT * FROM table WHERE displayName="Red"
有没有Lua函数能够让我这样搜索?
点赞
用户2726734
没有内置函数用于搜索表格。有多种方法可以完成,这些方法在复杂度和效率上也有所不同。
local t = {
r={displayname="Red", name="Ruby", age=15, x=4, y=10},
y={displayname="Blue", name="Trey", age=22, x=3, y=2},
t={displayname="Red", name="Jack", age=20, x=2, y=3},
h={displayname="Red", name="Tim", age=25, x=2, y=33},
v={displayname="Blue", name="Bonny", age=10, x=2, y=0}
}
在 Lua 编程 中,他们建议建立一个反转表来实现高效的查找。
revDisplayName = {}
for k,v in pairs(t) do
if revDisplayName[v.displayname] then
table.insert(revDisplayName[v.displayname], k)
else
revDisplayName[v] = {k}
end
end
然后你可以很容易地匹配显示名称。
for _, rowname in pairs(revDisplayName["Red"]) do
print(t[rowname].x, t[rowname].y)
end
如果你想构建复杂的查询,可以在 Lua 中对 Lua 表格使用类似 SQL 的查询代码,如 Lua 编程入门 中的代码。
如果你只想为匹配搜索几条记录,你可以使用 Lua 中的迭代器来抽象搜索。
function allmatching(tbl, kvs)
return function(t, key)
repeat
key, row = next(t, key)
if key == nil then
return
end
for k, v in pairs(kvs) do
if row[k] ~= v then
row = nil
break
end
end
until row ~= nil
return key, row
end, tbl, nil
end
你可以这样使用:
for k, row in allmatching(t, {displayname="Red", x=2}) do
print(k, row.name, row.x, row.y)
end
其输出如下:
h Tim 2 33
t Jack 2 3
2014-11-15 17:17:07
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
直接的方法是遍历所有元素并找到符合条件的元素:
local t={ r={ x=1, y=1, displayName="Red", }, y={ x=1, y=2, displayName="Yellow", }, } for key, value in pairs(t) do if value.displayName == 'Red' then print(key) end end这将打印出 'r'。
在大型表上,这可能会很慢。为了加快这个过程,您可以在一个哈希表中跟踪引用,这将提供更快的访问速度。下面的代码可能有效:
local cache = {} local function findValue(key) if cache[key] == nil then local value -- 做一个线性搜索,遍历表中的元素搜索 'key' -- 如果找到了,存储结果 cache[key] = value end return cache[key] end如果表中的元素更改了它们的值,则需要在更新或删除值时使缓存失效。