如何基于其中一个数据部分将表格排序为表格?

我是一个使用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

谢谢!

点赞
用户1094529
用户1094529

你需要使用 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)

这篇文章有更多信息

2017-07-25 01:59:45
用户6684651
用户6684651

你可以创建一个处理这个问题的函数:

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 被返回。

希望这有所帮助。

2017-07-25 02:58:54
用户2858170
用户2858170

这一行代码会按照 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)`
2017-07-25 07:25:50