Lua按键值对数组进行排序

3

我有一个由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值。
这是我正在开发的赛车游戏,我正在尝试根据玩家当前驾驶的检查点来计算他们在比赛中的位置。

请阅读Lua手册,里面都有。 - Piglet
2个回答

4
请参考Lua参考手册:

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

如果您实现了一个告诉Lua哪个元素排在前面的函数comp,table.sort(racers, comp)将起作用。

简单示例:

local animals = {
     {name = "bunny", size = 4},
     {name = "mouse", size = 1},
     {name = "cow", size = 30}
}
-- sort animals by size descending
table.sort(animals, function(a,b) return a.size > b.size end)

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

print()

-- sort animals by size ascending
table.sort(animals, function(a,b) return a.size < b.size end)
for i,v in ipairs(animals) do print(v.name) end

你只需要知道顺序,然后复制几个值即可。或者编写自己的排序算法。

我的问题在于最后一部分:“排序算法不稳定:按照给定顺序相等的元素可能会因排序而改变它们的相对位置。”我知道会有相等的值。 - Chase
@Chase,这有什么问题吗?如果你知道如何正确排序它们的话。 - Piglet
我已经尝试过一些方法,但它会改变列表的索引。我希望列表中的项目保留它们的索引。例如,如果racers [6] .plCP为12,并且所有其他值都为0,则将racers [6]的索引更改为racers [1],因为它具有最高的值。重要的是索引(在此情况下为6)保持不变,因为那里存储了玩家的ID。如何使索引保持不变,但更改plPos的值? - Chase
是的,在任何语言中,“sorting”的意思就是重新排列值,例如:tmp = arr[6]; arr [6] = arr [1]; arr [1]= tmp。如果你想要改变数组本身的条目而不是重新排列它们,你需要做一些不同的事情。由于lua通过引用传递表参数,因此您可能会对这样的“sort”函数感到满意,例如:funtion(a,b) if a.plCP<b.plCP then a.plCP, b.plCP = b.plCP, a.plCP end return false end。如果您打算让其他人使用或查看代码,确保您使用副作用的方式是明确的,这可能是一个很好的风格。 - Dimitry
@Chase也许你应该做一些Lua教程并且加强你的基础。如果你有更多经验,像你这样的问题是非常容易解决的。另外,尝试用普通语言写下来,然后再将其翻译成Lua。 - Piglet

0
你可以创建一个函数来获取比较函数:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接