Lua 表中某个值出现次数的计数

基本上我想要做的是将一个格式为

result={{id="abcd",dmg=1},{id="abcd",dmg=1},{id="abcd",dmg=1}}

的表转换成下面这种格式的表:

result={{id="abcd",dmg=1, qty=3}}

所以我需要知道 {id="abcd",dmg=1} 在表中出现了几次。有人知道比嵌套的 for 循环更好的做法吗?

点赞
用户1847592
用户1847592
result={{id="abcd",dmg=1},{id="defg",dmg=2},{id="abcd",dmg=1},{id="abcd",dmg=1}}

local t, old_result = {}, result
result = {}
for _, v in ipairs(old_result) do
  local h = v.id..'\0'..v.dmg
  v = t[h] or table.insert(result, v) or v
  t[h], v.qty = v, (v.qty or 0) + 1
end

-- result: {{id="abcd",dmg=1,qty=3},{id="defg",dmg=2,qty=1}}
result={{id="abcd",dmg=1},{id="defg",dmg=2},{id="abcd",dmg=1},{id="abcd",dmg=1}}

local t, old_result = {}, result
result = {}
for _, v in ipairs(old_result) do
  local h = v.id..'\0'..v.dmg
  v = t[h] or table.insert(result, v) or v
  t[h], v.qty = v, (v.qty or 0) + 1
end

-- result: {{id="abcd",dmg=1,qty=3},{id="defg",dmg=2,qty=1}}

解释如下:

定义一个表 result,其中包含 4 个元素,每个元素是一个包含 iddmg 属性的表。

old_result 表赋值为 result

result 表赋值为空表。

使用 for 循环遍历 old_result 表中的元素。对于每个元素,将其 id 属性和 dmg 属性拼接起来,形成字符串 h

检查表 t 中是否已经有键值为 h 的元素。如果没有,则将当前元素 v 作为值,将其插入到 result 表中,同时将其赋值给变量 v。如果有,则直接将与键 h 对应的值赋值给变量 v

将键 h 对应的值设为 v,并将变量 vqty 属性加 1。

最终,result 中只包含 2 个元素,且每个元素都包含 iddmgqty 3 个属性。

2016-03-03 14:55:26
用户3979429
用户3979429

所以你想清除重复的内容,虽然更好的解决方案是不让重复的内容出现,这里是代码:

function Originals(parent)
    local originals = {}
    for i,object in ipairs(parent) do
        for ii,orig in ipairs(originals) do
            local dupe = true
            for key, val in pairs(object) do
                if val ~= orig[key] then
                    dupe = false
                    break
                end
            end
            if not dupe then
                originals[#originals+1] = object
        end
    end
    return originals
end

我试图让代码自我解释,但总的想法是它循环并将所有具有新内容的对象放在一边,然后返回它们。

警告: 代码未经过测试

2016-03-03 23:52:19