2013-11-14 74 views
3

陣列我有一個表在Lua:計數頻率成在Lua

 
p = {'sachin', 'sachin', 'dravid', 'Dhoni', 'yuvraj', 'kohli'} 

欲計數表中的每個名字的頻率。

 
test1 = {sachin=2, dravid=1, Dhoni=1, yuvraj=1, kohli=1} 

我想這個方案有很多的for循環。請看看我的代碼

 
> function exec(ele,p) 
count = 0 
for k,v in pairs(p) do 
if ele == p[k] then 
count = count +1 
end 
end 
return count 
end 


> new_table = {} 
> for k,v in pairs(p) do 
new_table[v] = exec(v,p) 
end 
> 
> for k,v in pairs(new_table) do 
print(k,v) 
end 
dhone 1 
yuvraj 1 
kohli 1 
sachin 2 
dravid 1 

我想這樣做更有效的方式。我怎樣才能做到這一點?

回答

3

你可以指望這樣的頻率:

function tally(t) 
    local freq = {} 
    for _, v in ipairs(t) do 
    freq[v] = (freq[v] or 0) + 1 
    end 
    return freq 
end 

而且這裏的另一個demo example

1

使用元表可以是用於這個簡單的例子一點是不必要的,只是示出了另一種選擇:

local mt = {__index = function() return 0 end} 
local newtable = {} 
setmetatable(newtable, mt) 

for _, v in pairs(p) do 
    newtable[v] = newtable[v] + 1 
end 

元方法__index以上給出了表0作爲默認值。

+0

'setmetatable(t,mt)'* t *一個錯字? – ms2008

+0

@ ms2008vip啊,是的,我測試了't'這個名字,但是在這裏發佈時,我注意到OP使用了'newtable'這個名字,所以我相應地改變了它,顯然我錯過了一個。修正了,謝謝。 –