Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 如何按值对内部表进行排序?_Lua_Lua Table_Computercraft - Fatal编程技术网

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

因此,正如标题所说,我想对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}, ...}
我希望这对所有人都有意义

链接到完整嵌套表: 仅供参考:我无法控制如何将表格返回给我;我从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