我对Lua很新,所以请保持温柔。
我希望根据"错误"排序结果键。对于此示例,输出应为:
c 50 70
d 25 50
b 30 40
a 10 20
这是我的剧本:
records = {}
records["a"] = {["count"] = 10, ["error"] = 20}
records["b"] = {["count"] = 30, ["error"] = 40}
records["c"] = {["count"] = 50, ["error"] = 70}
records["d"] = {["count"] = 25, ["error"] = 50}
function spairs(t, order)
-- collect the keys
local keys = {}
for k in pairs(t) do keys[#keys+1] = k end
-- if order function given, sort by it by passing the table and keys a, b,
-- otherwise just sort the keys
if order then
table.sort(keys, function(a,b) return order(t, a, b) end)
else
table.sort(keys)
end
-- return the iterator function
local i = 0
return function()
i = i + 1
if keys[i] then
return keys[i], t[keys[i]]
end
end
end
for k, v in pairs(records) do
for m, n in pairs(v) do
for x, y in spairs(v, function(t,a,b) return t[b] < t[a] end) do
line = string.format("%s %5s %-10d", k, n, y)
end
end
print(line)
end
我找到了this about sorting一张桌子并尝试实施它。但它不起作用,结果没有排序。
答案 0 :(得分:1)
table.sort
才有效。在你的情况下;当您尝试拨打spairs
时,您实际上是在table.sort
和count
索引上调用error
。
首先关闭;删除丑陋,无关的嵌套for..pairs
循环。您只需要spairs
来完成任务。
for x, y in spairs(records, function(t, a, b) return t[b].error < t[a].error end) do
print( x, y.count, y.error)
end
就是这样。