Lua 如何按值对内部表进行排序?
因此,正如标题所说,我想对Lua中的一个表进行排序。 下面是一个这样的嵌套表示例Lua 如何按值对内部表进行排序?,lua,lua-table,computercraft,Lua,Lua Table,Computercraft,因此,正如标题所说,我想对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']表格,其中分别列出了tab
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}, ...}
我希望这对所有人都有意义
链接到完整嵌套表:
仅供参考:我无法控制如何将表格返回给我;我从API中的函数listItems()
中获得了它们。首先,数组的语法不正确。它应该更像:
local people = {
{Name="Alice",Score=10},
{Name="Bob",Score=3},
{Name="Charlie",Score=17}
}
其次,table.sort
函数应该完成这项工作。在我的特定示例中,它将如下所示:
最后,要获得顶部N
只需迭代:
所以,我做了一段时间,多亏了社区回答,我想出了这篇文章:
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
您需要在[]中输入数字以获得正确的语法。排序={[1]={displayName=Cobblestone,amount=190103},[2]={displayName=Dirt,amount=281}即使自然数索引是默认值,但只是为了防止您需要以不同的顺序指定元素。第3行中缺少逗号。此外,您还应确保N不超过#人。否则你“我会在索引nil值时出错。@Pieget修复了逗号,N超过#如果他这样做,人们会犯错误,我只是简单地解释了怎么做。@warspyking,但可以这样更正:因为I=1,N@tony虽然是真的,但他一开始就不应该遇到这个问题。”。为什么要运行额外的代码,代价是效率低下?@warspyking很抱歉,我应该提到我对原始代码没有控制权,它是由外部api返回的。
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
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