【问题标题】:Lua sort array by key valuesLua 按键值排序数组
【发布时间】:2018-09-12 12:11:09
【问题描述】:

我有一个由 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}

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

这是针对我正在开发的一款赛车游戏,我正在尝试根据玩家当前正驶向哪个检查点来计算玩家在比赛中的位置。

【问题讨论】:

  • 请阅读 Lua 手册。都在里面。

标签: arrays sorting lua


【解决方案1】:

请参考 Lua 参考手册:

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

table.sort (list [, comp])

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

table.sort(racers, comp) 如果你实现了一个函数 comp 来告诉 Lua 两个元素中的哪一个先出现,那么它就可以解决问题。

简单示例:

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 这是怎么回事?如果您知道如何正确排序它们?
  • 我有点搞砸了,它改变了列表的索引。我希望列表中的项目保留它们的索引。例如,如果racers[6].plCP 为12,其余的值为0,那么它将racers[6] 的索引更改为racers[1],因为它具有最高值。重要的是索引(本例中为 6)保持不变,因为这是存储玩家 ID 的位置。我将如何使索引保持不变,但 plPos 的值发生了变化?
  • 是的,这就是“排序”的意思,在任何语言中,它都会重新排列值,执行类似tmp = arr[6]; arr[6]=arr[1]; arr[1]=tmp 的操作。如果您想自己更改条目,而不是重新排列数组,您需要做一些不同的事情。由于 lua 通过引用传递表参数,您可能会对这样的排序函数感到满意:funtion(a,b) if a.plCP&lt;b.plCP then a.plCP, b.plCP = b.plCP, a.plCP end return false end。但是,如果您希望您的代码被其他人使用或看到,那么确保您对副作用的使用是明确的,这可能是一种很好的风格。
  • @Chase 也许您应该学习一些 Lua 教程并学习基础知识。如果您有更多经验,那么像您这样的问题非常容易解决。也试着用普通话写下来。然后翻译成Lua
猜你喜欢
  • 2014-11-27
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 2019-03-27
  • 1970-01-01
  • 2016-05-02
相关资源
最近更新 更多