【问题标题】:Lua - Sorting a Table by StringLua - 按字符串对表进行排序
【发布时间】:2020-10-17 22:05:12
【问题描述】:

我已经为我的记分牌制作了一个这样的 LUA 表:

Score.Ranks = {}

Score.Ranks["superadmin"]     = {name = "Boss", col = Color(183, 109, 253) }
Score.Ranks["operator"]       = {name = "Chief", col = Color(254, 129, 1) }
Score.Ranks["commander"]      = {name = "Commander", col = Color(222, 54, 54) }
Score.Ranks["moderator"]      = {name = "Director", col = Color(53, 225, 227) }

我想对此表进行排序,以便“名称”在我的记分板上显示时按以下顺序排序:

Boss
Director
Commander
Chief

我该怎么做?

【问题讨论】:

  • 有一个小争议:您是要按“名称”字段排序还是手动排序?因为在您的示例中,“导演”应该按字母顺序排在最后。
  • 我想按名称字段或超级管理员操作员指挥官字段排序,以通常设置的为准。
  • 您无法真正对哈希表进行排序。至少不是 lua 对它们的实现。所以“这样对'名称'进行排序”是没有意义的。不知道记分牌是如何显示的。如果你想要特定的顺序,只需使用数组。
  • 你的排序对我来说没有意义。您按什么排序以使“老板”首先出现,是名字还是等级?为什么“指挥官”后面会出现“指挥官”?如果你脑子里有什么东西让这件事发生,那就需要把它拼出来。

标签: sorting lua lua-table


【解决方案1】:

因为您只有 4 件商品,所以我只需手动将它们分类。

print("Scoreboard:")
print(Score.Ranks.superadmin.name)
print(Score.Ranks.moderator.name)
print(Score.Ranks.commander.name)
print(Score.Ranks.operator.name)

您必须告诉您的计算机,超级管理员出现在版主之前,以便稍后对其进行排序。但是,如果您无论如何都必须为每个条目输入优先级,则无需排序。并不是说您可以从任何属性中得出订单。

【讨论】:

  • 这是我正在尝试修改“config.lua”的插件。当我在游戏中按 Tab 键时,它会显示一个排名未排序的记分牌。我正在尝试对该排名进行排序。所以我不确定我是否可以在那里使用打印命令。
  • 打印只是一个例子。我不知道你用什么来显示记分板。 Scroe.Ranks 无法排序,因为它没有顺序。您必须定义使用这些条目的顺序。但是这样就不需要自动排序了。
【解决方案2】:

你只能对带有数字索引的表进行排序,所以首先转换表:

Score.Ranks = {}

Score.Ranks["operator"]       = {name = "Chief", col = Color(254, 129, 1) }
Score.Ranks["superadmin"]     = {name = "Boss", col = Color(183, 109, 253) }
Score.Ranks["commander"]      = {name = "Commander", col = Color(222, 54, 54) }
Score.Ranks["moderator"]      = {name = "Director", col = Color(53, 225, 227) }

local tmp_t = {}
for k,v in pairs(Score.Ranks) do
    local rank = (k=="superadmin") and 1 or (k=="operator" and 3 or 2) 
    table.insert(tmp_t, { rank = rank .. v.name, key = k, name = v.name, col = v.col} )
end

然后按名称对表进行排序,然后使用它。

    table.sort(tmp_t ,  function (a, b) return  (a.rank <  b.rank ) end)        
    for k,v in pairs(tmp_t) do
         print(k , v.rank, v.key, v.name)
    end
 

【讨论】:

  • 这如何解决问题?除了已经有无数关于如何通过可以链接的键对表格进行排序的答案之外,还有 4 个表格元素没有任何明显的顺序。因此,在您可以进行任何排序之前,您必须为 4 个键中的每一个赋予一个优先级,该优先级已经手动对表进行排序。 Lua 的 table.sort 也已经在 C 中实现了快速排序。为什么要在 Lua 中自己做呢?
  • @Piglet 你是对的,我删除了不需要的快速排序
  • 您的回答仍然毫无意义。我的意思是从质量上讲这是一个很好的答案,但它并不能解决问题。他不想按名字排序。他想要的是那些不能按字母顺序从键或名称派生的名称的特定顺序,因此必须手动完成。
  • @Piglet 我想按名称或 4 类操作员超级管理员等排序。超级管理员应该在顶部,操作员在底部。
  • 是的,但不知何故你不明白我的回答。如果你必须手动给它们优先级,那么对 4 件事进行排序是没有意义的......
猜你喜欢
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 2014-04-15
  • 2018-07-07
相关资源
最近更新 更多