如何根据表中的1个单个数据部分对表进行排序?

时间:2017-07-25 01:42:10

标签: lua

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

我有很多"对象"这是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
--]]
---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

谢谢!

3 个答案:

答案 0 :(得分:2)

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

This article has more information

答案 1 :(得分:0)

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

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

要颠倒顺序,请替换&gt; by&lt;。

来自Lua参考手册:

  

table.sort(list [,comp])

     

按照给定顺序对列表[1]中的列表元素进行排序   列表[#list。如果给出comp,那么它必须是一个函数   接收两个列表元素,并在第一个元素时返回true   必须在最后的顺序中排在第二顺序之前(这样,在...之后   排序,我&lt; j表示不是comp(list [j],list [i]))。如果没有给出补偿,   那么标准的Lua算子&lt;而是用来代替。

     

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

     

排序算法不稳定:被认为相等的元素   给定的顺序可以通过排序改变它们的相对位置。

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

答案 2 :(得分:-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]在增加返回表nil的大小之前不等于rt,以便rt中的每个值从最大到最小排序,从索引开始<{1}},以索引1结尾,最后返回#rt

我希望这会有所帮助。