如何根据表中的 1 个单个数据部分将表排序到表?



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

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

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

这是一个例子。TTS的制造商已经做到了,因此您可以像这样访问所有部件。所以我可以控制对象..然后是它的各个部分。有一堆,比如名字、网格、扩散等等。Roations{x,y,z} etc etc

无论如何。我有一个对象表...并希望根据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

谢谢!

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

本文包含更多信息

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

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

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

来自Lua参考手册:

table.sort (list [, comp](

按给定顺序对列表元素进行排序,就地排序,从列表[1]到 列表[#list].如果给出 comp,那么它必须是一个函数 接收两个列表元素,并在第一个元素时返回 true 必须在最终顺序中的第二个之前(因此,在 排序,i

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

排序算法不稳定:元素被 给定的顺序可能会通过排序更改其相对位置。

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

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

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

我希望这有所帮助。

最新更新