如何在Lua中创建一个类似于HashMap<Int,Int []>的东西

我想在 Lua 中拥有一个简单的数据结构,类似于 Java 的 HashMap 等效结构。

这样做的目的是,我希望维护一个唯一键 'userID',将其映射到一组两个不断更新的值,例如;

'77777', {254, 24992}

有什么建议,我该如何实现这个?


-- Indiviuall Aggregations
local dictionary = ?

-- Other Vars
local sumCount = 0
local sumSize = 0
local matches = redis.call(KEYS, query)

for _,key in ipairs(matches) do
    local val = redis.call(GET, key)
    local count, size = val:match(([^:]+):([^:]+))

    topUsers(string.sub(key, 11, 15), sumCount, sumSize)

    -- Global Count and Size for the Query
    sumCount = sumCount + tonumber(count)
    sumSize = sumSize + tonumber(size)
end

local result = string.format(%s:%s, sumCount, sumSize)
return result;

-- Users Total Data Aggregations
function topUsers()
  -- Do sums for each user
end
点赞
用户107090
用户107090

只需要使用一个以 userID 作为索引的 Lua table,其中的值是另一个包含两个条目的 Lua table:

T['77777']={254, 24992}
2014-02-19 14:05:25
用户869951
用户869951

假设字典就是你询问的内容:

local dictionary = {
    ['77777'] = {254, 24992},
    ['88888'] = {253, 24991},
    ['99999'] = {252, 24990},
}

棘手的部分在于键是一个不能转换为 Lua 变量名的字符串,所以必须用 [] 包围每个键。我无法在 Lua 5.1参考手册 中找到关于此规则的明确说明,但 Lua Wiki 表示,如果一个键“由下划线、字母和数字组成,但不以数字开头”,则在上述方式中定义时不需要 [],否则需要方括号。

2014-02-19 14:11:20
用户287893
用户287893

这是解决方案的可能实现。

local usersTable = {}

function topUsers(key, count, size)
    if usersTable[key] then
        usersTable[key][1] = usersTable[key][1] + count
        usersTable[key][2] = usersTable[key][2] + size
    else
        usersTable[key] = {count, size}
    end
end

function printTable(t)
    for key,value in pairs(t) do
        print(key, value[1], value[2])
    end
end
2014-02-19 20:06:30