在Lua中按嵌套值对表进行排序

我有一个程序,它会对每个用户执行的下载总数进行汇总,并对下载的数据总量进行聚合(以kb为单位)。

local table = {}
table[userID] = {5, 23498502}

我的目标是,printTable函数的输出将会按照下载量(v[2])的降序,产生整个用户列表。

local aUsers = {}

...

function topUsers(key, nDownloads, totalSize)
    if aUsers[key] then
        aUsers[key][1] = aUsers[key][1] + nDownloads
        aUsers[key][2] = aUsers[key][2] + totalSize
    else
        aUsers[key] = {nDownloads, totalSize}
    end
end

function printTable(t)
    local str = ""

    -- How to sort 't' so that it prints in v[2] descending order?

    for k,v in pairs(t) do
        str = str .. k .. ", " .. v[1] .. ", " .. v[2] .. "\n"
    end

    return str
end

...

想法是怎么样的?

点赞
用户1442917
用户1442917

你可以将键放入单独的表中,然后使用你需要的条件对该表进行排序:

local t = {
  a = {1,2},
  b = {2,3},
  c = {4,1},
  d = {9,9},
}
local keys = {}
for k in pairs(t) do table.insert(keys, k) end
table.sort(keys, function(a, b) return t[a][2] > t[b][2] end)
for _, k in ipairs(keys) do print(k, t[k][1], t[k][2]) end

将会输出:

d   9   9
b   2   3
a   1   2
c   4   1
2014-02-19 23:31:59