2016-12-18 49 views
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}, 
     } 

所以我想可以概括我的數量值並在表中進行分組,如示例中所示。有人對這個問題有想法嗎?有沒有這樣做的功能?

感謝您的回答。對不起,如果我的英語不好,這不是我的母語。

回答

0

這裏有一種可能性。 (我假設你的唯一關鍵就是ID,如果沒有相應的調整。另外,我只添加數量,你可能還需要增加傷害。)

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) 
+0

這破壞了「tab1」的內容。也許OP是這樣的... – lhf

+0

現在好了嗎? (我認爲你的方式更短 - 對於子表中相對短的鍵數。) – tonypdmtr

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 
相關問題