如何根据它的 1 个数据部分对表排序 Table?

How to order a Table to tables based on 1 single data part of it?

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

我有一些 "objects",这是 TTS 中的 table,其中包含这些对象的各种数据。例如.. obj.position = {x,y,z}... 也可以在轴级别访问。

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

这是一个例子。 TTS 的制造商已经做到了,因此您可以像那样访问所有部分。所以我可以访问对象.. 然后是它的各个部分。有一堆,比如 name、mesh、diffuse 等等。旋转 {x,y,z} 等等

无论如何。我有一个 table 个对象...并想根据 x 轴的位置数据对这些对象进行排序...从最高到最低。因此,如果我有一个 table 和 obj1,其中 table 是 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
--]]

我希望我说得有道理。我最近几个月自学了!

所以基本上我有一个 table 个对象,我想根据附加到 table 中每个单独对象的单个值对 table 中的对象进行排序。在这种情况下 obj.position.x

谢谢!

你需要table.sort。第一个参数是要排序的 table,第二个是比较项目的函数。

示例:

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)

This article has more information

您可以创建一个函数来处理这件事:

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首先取入给定table内的每一个x值,同时根据每一个x值在tableinds内放置一个新的索引(使它们从小到大排序),然后得到x_data数组table中的最小值,用于依次遍历indstable . fix_table 检查以确保 inds[i] 不等于 nil,然后再增加 return table rt 的大小,以便每个值在 rt 中从大到小排序,从索引 1 开始,到索引 #rt 结束,最后 rt 是 returned.

希望对您有所帮助。

table.sort(tableOfObjects, function(a, b) return a.position.x > b.position.x end)

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

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

来自Lua参考手册:

table.sort (list [, comp])

Sorts list elements in a given order, in-place, from list[1] to list[#list]. If comp is given, then it must be a function that receives two list elements and returns true when the first element must come before the second in the final order (so that, after the sort, i < j implies not comp(list[j],list[i])). If comp is not given, then the standard Lua operator < is used instead.

Note that the comp function must define a strict partial order over the elements in the list; that is, it must be asymmetric and transitive. Otherwise, no valid sort may be possible.

The sort algorithm is not stable: elements considered equal by the given order may have their relative positions changed by the sort.

换句话说,table.sort 将按值升序对 table 进行排序。 如果你想降序排序或按 table 值以外的顺序排序(比如你的 table 值位置的 x 坐标),你必须提供一个函数来告诉 Lua哪个元素先出现。