如何基于其中一个数据部分将表格排序为表格?
我是一个使用LUA制作桌面模拟器模组的爱好者,有一个问题我无法解决。
我有许多“对象”,它是TTS中包含各种数据的表格。例如:obj.position = {x,y,z}……也可以在轴水平上访问。
obj.position = {5,10,15} -- x,y,z
obj.position.x == 5
这是一个例子。 TTS的制造商使您可以像那样访问所有部件,因此我可以访问对象,然后访问其各个部件。还有很多像名字、网格、散射等等。 roations {x,y,z}等等
无论如何。 我有一个对象表...并希望基于x轴的定位数据对这些对象进行排序...从最高到最低。因此,如果我有一个表和其中的obj1是x = 3,obj2是x = 1和obj3 = x = 2,则会将其排序为obj2,obj3,obj1
伪代码:
tableOfObjects = {obj1,obj2,obj3}--[[
tableOfObjectsp[1] == obj1
tableOfObjectsp[2] == obj2
tableOfObjectsp[3] == obj3
tableOfObjectsp[1].position.x == 3
tableOfObjectsp[2].position.x == 1
tableOfObjectsp[4].position.x == 2
--]]---排序后,它将成为此列表
tableOfObjects = {obj1,obj3,obj2}--[[
tableOfObjectsp[1] == obj1
tableOfObjectsp[2] == obj3
tableOfObjectsp[3] == obj2
tableOfObjectsp[1].position.x == 3
tableOfObjectsp[2].position.x == 2
tableOfObjectsp[3].position.x == 1
--]]
我希望我的话有意义。在过去几个月中,我是自学的!
因此,基本上我有一个对象表,并希望基于表中每个单独对象附加的单个值对该表中的对象进行排序。在这种情况下,obj.position.x
谢谢!
你可以创建一个处理这个问题的函数:
local function fix_table(t)
local x_data = {};
local inds = {};
local rt = {};
for i = 1, #t do
x_data[#x_data + 1] = t[i].position.x;
inds[t[i].position.x] = t[i];
end
local min_index = math.min(table.unpack(x_data));
local max_index = math.max(table.unpack(x_data));
for i = min_index, max_index do
if inds[i] ~= nil then
rt[#rt + 1] = inds[i];
end
end
return rt;
end
local mytable = {obj1, obj2, obj3};
mytable = fix_table(mytable);
fix_table 函数首先获取给定表格中每个 x 值,然后根据每个 x 值在 inds 表格中插入新索引(以便从小到大进行排序),接下来获取 x_data 数组表格中的最小值,用于有序遍历 inds 表格。fix_table 检查 inds[i] 是否不等于 nil,以确保它在增加返回表格 rt 的大小之前。这样,rt 中的每个值都是从大到小排序的,并以索引 1 开始,以索引 #rt 结束。最后,rt 被返回。
希望这有所帮助。
这一行代码会按照 x 坐标的降序排列,对 tableOfObjects 表格进行排序。
要改变排序的顺序,将 > 替换为 <。
参考 Lua 参考手册:
table.sort (list [, comp])
对 list 元素就地按照给定的顺序排序,从 list[1] 到 list[#list]。如果提供了 comp 函数,它必须是一个函数,接受两个列表元素,并在最终顺序中第一个元素必须出现在第二个元素前时返回 true(因此,在排序后,i<j 意味着 i < j 表示非 comp(list[j],list[i]))。如果未提供 comp,则使用标准 Lua 操作符<。
请注意,comp函数必须定义列表中元素之间的严格偏序;也就是说,它必须是反称和传递的。否则,可能无法进行有效的排序。
排序算法不稳定:被给定顺序视为相等的元素可能通过排序来改变它们的相对位置。
因此,换句话说,table.sort将根据其值按升序对表进行排序。 如果您想进行降序排序或按其他方式(例如在您的情况下,表值位置的 x 坐标)排序,您必须提供一个告诉 Lua 哪个元素将首先出现的函数。
`table.sort(tableOfObjects, function(a, b) return a.position.x > b.position.x end)`
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的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 代码?

你需要使用
table.sort函数。第一个参数是要排序的表格,第二个参数是用于比较元素的函数。例如:
t = { {str = 42, dex = 10, wis = 100}, {str = 18, dex = 30, wis = 5} } table.sort(t, function (k1, k2) return k1.str < k2.str end)这篇文章有更多信息。