如何在双维表中对值进行分组?

时间:2016-12-18 20:55:43

标签: lua computercraft

我尝试将值放在另一个表中的双维表中,但没有重复。我所做的所有尝试都会创建一个包含重复项的表。

以下是一个例子:

这是我的表:

tab1 = {
       {id = "id1", dmg = 0, qty = 1},
       {id = "id2", dmg = 0, qty = 1},
       {id = "id3", dmg = 0, qty = 1},
       {id = "id1", dmg = 0, qty = 1},
       }

我想要另一张这样的表:

tab2 = {
       {id = "id1", dmg = 0, qty = 2},
       {id = "id2", dmg = 0, qty = 1},
       {id = "id3", dmg = 0, qty = 1},
       }

所以我想要对我的数值进行求和,并将表格作为示例中的集合。有人对这个问题有所了解吗?有没有这样做的功能?

感谢您的回答。对不起,如果我的英语不好,那不是我的母语。

2 个答案:

答案 0 :(得分:1)

没有内置功能。你必须自己写。这是我的看法。

tab1 = {
       {id = "id1", dmg = 0, qty = 1},
       {id = "id2", dmg = 0, qty = 1},
       {id = "id3", dmg = 0, qty = 1},
       {id = "id1", dmg = 0, qty = 1},
}

local a={}
for k,v in ipairs(tab1) do
    local id=v.id
    if a[v.id]==nil then
        a[v.id] = { id=v.id, dmg=v.dmg, qty=v.qty }
    else
        a[v.id].qty=a[v.id].qty+v.qty
    end
end

local tab2={}
local n=0
for k,v in pairs(a) do
    n=n+1
    tab2[n]=v
end
table.sort(tab2, function (a,b) return a.id < b.id end)

for k,v in ipairs(tab2) do
    print(k,v.id,v.dmg,v.qty)
end

答案 1 :(得分:0)

这是一种可能性。 (我假设你的唯一键只是id。如果没有,请相应调整。另外,我只需要添加数量,你可能还需要添加dmg。)

tab1 = {
       {id = "id1", dmg = 0, qty = 1},
       {id = "id2", dmg = 0, qty = 1},
       {id = "id3", dmg = 0, qty = 1},
       {id = "id1", dmg = 0, qty = 1},
       }

function tablecopy(t)
  local ans = {}
  for k,v in pairs(t) do
    ans[k] = v
  end
  return ans
end

function nodups(t)
  local temp = {} --workspace

  for _,t in ipairs(t) do
    if temp[t.id] == nil then
      temp[t.id] = tablecopy(t)
    else
      temp[t.id].qty = temp[t.id].qty + t.qty
      --temp[t.id].dmg = temp[t.id].dmg + t.dmg
    end
  end

  -- and, if you need to convert to array
  local t = {}
  for _,v in pairs(temp) do
    t[#t+1] = v
  end

  return t
end

tab2 = nodups(tab1)