Lua对表中的表进行排序

时间:2014-11-17 20:23:26

标签: sorting lua lua-table

我对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一张桌子并尝试实施它。但它不起作用,结果没有排序。

1 个答案:

答案 0 :(得分:1)

仅当表元素被整体编入索引时,

table.sort才有效。在你的情况下;当您尝试拨打spairs时,您实际上是在table.sortcount索引上调用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

就是这样。