2014-02-19 123 views
4

我有一个程序,它可以为每个用户汇总以kb为单位的总下载数据的总计下载总数。在Lua中通过嵌套值对表格进行排序

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

我的目标是,printTable功能会产生用户在通过KB量降序排列整个列表的输出下载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 

... 

任何想法我怎么能做到这一点?

回答

2

可以拿到钥匙到一个单独的表,然后使用你所需要的标准进行排序该表:

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