2

ダブル ディメンション テーブルの値を別のテーブルにグループ化しようとしましたが、重複はありません。私が行ったすべての試みは、重複のあるテーブルを作成します。

次に例を示します。

これは私のテーブルです:

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},
       }

したがって、例のように、数量の値を合計し、テーブルをグループ化する必要があります。誰かがこの問題のアイデアを持っていますか? これを行う機能はありますか?

回答ありがとうございます。私の英語が下手で申し訳ありませんが、それは私の母国語ではありません。

4

2 に答える 2

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
于 2016-12-18T22:40:00.403 に答える
0

ここに 1 つの可能性があります。(一意のキーは 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)
于 2016-12-18T22:37:02.617 に答える