Hash Lua:将表中的每个新元素设置为默认值
我想得到字符串中最常见的k大小的子字符串。为了实现这一点,我使用一个表来存储每个子字符串的出现次数。代码如下:Hash Lua:将表中的每个新元素设置为默认值,hash,lua,lua-table,Hash,Lua,Lua Table,我想得到字符串中最常见的k大小的子字符串。为了实现这一点,我使用一个表来存储每个子字符串的出现次数。代码如下: function frequentWords(seq, k) local subs = "" local counter = {} for i = 1,(seq:len()-k+1) do subs = seq:sub(i, i+k-1) counter[subs] = (counter[subs] and counter[subs] + 1 or 1)
function frequentWords(seq, k)
local subs = ""
local counter = {}
for i = 1,(seq:len()-k+1) do
subs = seq:sub(i, i+k-1)
counter[subs] = (counter[subs] and counter[subs] + 1 or 1)
--print(subs .. ": " .. counter[subs])
end
end
行计数器[subs]=(计数器[subs]和计数器[subs]+1或1)
具有与计数器[subs]=(计数器[subs]?计数器[subs]+1:1)
相同的平均值。如果我们可以用0
设置每个新的counter
元素,则此行将仅为counter[subs]=counter[subs]+1
。这在卢阿可能吗?如果不是,做类似事情的最佳方式是什么
例如,在Ruby中,这是通过如下方式声明哈希来完成的:
counter = Hash.new(0)
您可以在
计数器
中设置\u索引
元方法以返回0:
setmetatable(counter,{__index=function () return 0 end})
但这更容易、更清楚:
counter[subs] = (counter[subs] or 0) + 1
对于您的情况,lhf的解决方案就足够了。为了完整起见,我想提到一种更复杂的方法,它支持一些稍微复杂的功能。具体地说,当您将它与可变值(如表)一起使用时,它的行为“正如您所期望的那样”:它既创建项,又在创建时将其分配给键
function defaultTable(constructor)
local new = {}
local function initIndex(key)
local value = constructor()
new[key] = value
return value
end
setmetatable(new, {__index=initIndex})
return new
end
您可能需要
rawset
来避免循环。我只使用了_索引,仅当您试图获取一个值时,以及仅当表中该键处没有项时,才会调用该索引。我不重写书写部分,它正常工作。