Lua按键值对数组进行排序

我有一个由32个元素组成的数组,形式如下:

racers[i] = {plCP = 0, plPos = 0}

我想按照plCP的值对这个数组进行排序,并将plPos设置为排序结果。类似这样:

racers[1] = {plCP = 3, plPos = 3}
racers[2] = {plCP = 2, plPos = 4}
racers[3] = {plCP = 6, plPos = 2}
racers[4] = {plCP = 12, plPos = 1}
racers[4] = {plCP = 6, plPos = 2}

请注意,有可能两个项具有相同的plCP值。在这种情况下,我希望它们具有相同的plPos值。

我正在制作一款赛车游戏,我正在尝试根据当前驾驶的检查点来计算玩家在比赛中的位置。

点赞
用户2858170
用户2858170

请参阅 Lua 参考手册:

https://www.lua.org/manual/5.3/manual.html#pdf-table.sort

table.sort (list [, comp])

按照给定顺序原地对 list 元素进行排序,从 list[1] 到 list[#list]。如果提供了 comp 函数,则该函数必须接收两个列表元素,并在最终顺序中返回 true,表示第一个元素必须在第二个元素之前出现(因此,在排序之后,i < j 意味着不 comp(list[j],list[i]))。如果未提供 comp,则使用标准 Lua 运算符 <。请注意,comp 函数必须定义 list 中元素的严格偏序;也就是说,它必须是不对称和传递的。否则,可能无法进行有效的排序。排序算法不是稳定的:按照给定顺序被视为相等的元素可能会在排序中更改其相对位置。

如果实现一个函数 comp 来告诉 Lua 两个元素中哪个先出现,则 table.sort(racers, comp) 就能实现目的。

简单例子:

local animals = {
     {name = "bunny", size = 4},
     {name = "mouse", size = 1},
     {name = "cow", size = 30}
}
-- 按照大小降序排序动物
table.sort(animals, function(a,b) return a.size > b.size end)

for i,v in ipairs(animals) do print(v.name) end

print()

-- 按照大小升序排序动物
table.sort(animals, function(a,b) return a.size < b.size end)
for i,v in ipairs(animals) do print(v.name) end

一旦知道顺序,您所需要做的就是复制几个值。或者您可以编写自己的排序算法。

2018-04-03 08:47:29
用户12968803
用户12968803

你可以创建一个用于获取比较函数的函数:

function sortByKey(key)
    return function(a, b)
        return a[key] < b[key]
    end
end

local people = {
    { name = "Alice", age = 25 },
    { name = "Bob", age = 32 },
    { name = "Charlie", age = 18 },
    { name = "Dave", age = 42 },
    { name = "Eve", age = 29 }
}

table.sort(people, sortByKey("age"))
print ('    sorted by age:')
for i, v in ipairs (people) do
    print (i, v.name, v.age)
end

table.sort(people, sortByKey("name"))
print ('    sorted by name:')
for i, v in ipairs (people) do
    print (i, v.name, v.age)
end

结果:

    sorted by age:
1   Charlie 18
2   Alice   25
3   Eve 29
4   Bob 32
5   Dave    42
    sorted by name:
1   Alice   25
2   Bob 32
3   Charlie 18
4   Dave    42
5   Eve 29
2023-02-28 11:25:24