【问题标题】:How to sort inner tables by value?如何按值对内表进行排序?
【发布时间】:2016-04-04 05:04:09
【问题描述】:

所以,正如标题所说,我想在 Lua 中对表进行排序。 下面是一个这样的示例嵌套表。

tabl = {2.0={amount=281.0, meta=0.0, displayName=Dirt, name=minecraft:dirt}, 3.0={amount=190103.0, meta=0.0, displayName=Cobblestone, name=minecraft:cobblestone}, ...}

我想查看并返回列出的前十名tabl[*]['amount'] 的表格,其中它们各自的tabl[*]['displayName'] * 是tabl[1.0]tabl[max.0] 的通配符

完成的表格应如下所示:

sorted = {1={displayName=Cobblestone, amount=190103}, 2={displayName=Dirt, amount=281}, ...}

我希望这对所有人都有意义。

完整嵌套表的链接:Full Piece 仅供参考:我无法控制如何将桌子归还给我;我从this API 中的函数listItems() 得到它们。

【问题讨论】:

  • 您需要在 [ ] 中输入数字才能获得正确的语法。 sorted = { [1]={displayName=Cobblestone, amount=190103}, [2]={displayName=Dirt, amount=281} } 尽管自然数索引是默认值,但以防万一您需要在不同的顺序。

标签: lua lua-table computercraft


【解决方案1】:

首先,您的数组 不是语法正确。它应该更像:

local people = {
    {Name="Alice",Score=10},
    {Name="Bob",Score=3},
    {Name="Charlie",Score=17}
}

其次,table.sort 函数应该可以完成这项工作。在我的特定示例中,它看起来这样:

table.sort(people, function(a,b) return a.Score > b.Score end)

最后,要获得顶级 N 只需迭代

for i = 1,N do
    print(people[i].Name, people[i].Score)
end

【讨论】:

  • 第 3 行中缺少逗号。您还应确保 N 不超过 #people。否则,索引 nil 值时会出错。
  • @Piglet 固定逗号,N超过#people会出错,我简单解释了怎么做。
  • @warspyking 但它可以像这样更正:for i = 1,N
  • @tony 虽然是这样,但他一开始就不应该遇到这个问题。为什么要以低效率为代价运行额外的代码?
  • @warspyking 很抱歉我应该提到我无法控制原始片段,它是由外部 api 返回的。
【解决方案2】:

所以,我为此工作了一段时间,感谢社区的回答,我想出了这篇文章:

bridge = peripheral.wrap("left")
items = bridge.listItems()

sorted = {}

for i, last in next, items do
  sorted[i] = {}
  sorted[i]["displayName"] = items[i]["displayName"]
  sorted[i]["amount"] = items[i]["amount"]
end

table.sort(sorted, function(a,b) return a.amount > b.amount end)

for i = 1, 10 do
  print(i .. ": " .. sorted[i].displayName .. ": " .. sorted[i].amount)
end

它返回了前 10 个库存:

1: Cobblestone: 202924
2: Gunpowder: 1382
3: Flint: 1375
4: Oak Sapling: 1099
5: Arrow: 966
6: Bone Meal: 946
7: Sky Stone Dust: 808
8: Certus Quartz Dust: 726
9: Rotten Flesh: 627
10: Coal: 618

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-23
    • 2010-11-18
    • 2020-02-08
    • 2018-09-15
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多