2

我是使用 LUA 在 TableTop Simulator 中制作模组的最业余爱好者,并且有一个我无法解决的问题。

我有许多“对象”,它们是 TTS 中的一个表,其中包含这些对象的各种数据。例如.. obj.position = {x,y,z}... 并且也可以在轴级别访问。

obj.position = {5,10,15} -- x,y,z
obj.position.x == 5

这是一个例子。TTS 的制造商已经做到了,因此您可以访问所有这样的部分。所以我可以访问对象..然后是它的各个部分。有一个堆,比如名称、网格、漫反射等等。旋转{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
--]]
---After Sort it would look this list
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

谢谢!

4

3 回答 3

3

你需要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-25T01:59:45.220 回答
0
table.sort(tableOfObjects, function(a, b) return a.position.x > b.position.x end)

此行将按 x 坐标降序对表 tableOfObjects 进行排序。

要颠倒顺序,请将 > 替换为 <。

来自 Lua 参考手册:

table.sort (list [, comp])

按给定顺序对列表元素进行就地排序,从 list[1] 到 list[#list]。如果给出了 comp,那么它必须是一个函数,它接收两个列表元素,并在第一个元素必须在最终顺序中的第二个元素之前返回 true(因此,在排序之后,i < j 意味着不是 comp(list[j ],列表[i]))。如果未给出 comp,则使用标准 Lua 运算符 < 代替。

请注意,comp 函数必须对列表中的元素定义严格的偏序;也就是说,它必须是不对称的和传递的。否则,可能无法进行有效排序。

排序算法不稳定:给定顺序认为相等的元素可能会因排序而改变它们的相对位置。

所以换句话说 table.sort 将按其值升序对表进行排序。如果您想按表值降序或按表值以外的其他值排序(例如在您的情况下表值位置的 x 坐标),您必须提供一个函数来告诉 Lua 哪个元素将首先出现。

于 2017-07-25T07:25:50.577 回答
-3

你可以创建一个函数来处理这个确切的事情:

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]不等于nilrt1#rtrt

我希望这会有所帮助。

于 2017-07-25T02:58:54.197 回答