如何在Lua </int,>中创建等效的HashMap <int,int [] =“”>

时间:2014-02-19 13:26:08

标签: data-structures dictionary lua redis hashmap

我希望在lua中有一个简单的数据结构,类似于Java HashMap等价物。

这样做的目的是,我希望保持一个唯一的键'userID'映射到一组两个值,这些值会不断更新,例如;

'77777', {254, 24992}

有关如何实现这一目标的任何建议?


-- Individual 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

3 个答案:

答案 0 :(得分:3)

假设字典是你要问的:

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

棘手的部分是密钥是一个无法转换为Lua变量名的字符串,因此您必须用[]包围每个密钥。我在Lua 5.1 reference manual找不到明确的规则说明,但Lua wiki表示如果一个键“由下划线,字母和数字组成,但不以数字开头”只有在以上述方式定义时才需要[],否则方括号是必需的。

答案 1 :(得分:0)

只需使用由userID索引的Lua表,并使用带有两个条目的另一个Lua表:

T['77777']={254, 24992}

答案 2 :(得分:0)

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

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