Hash Lua:将表中的每个新元素设置为默认值

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)

我想得到字符串中最常见的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)
    --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
来避免循环。我只使用了_索引,仅当您试图获取一个值时,以及仅当表中该键处没有项时,才会调用该索引。我不重写书写部分,它正常工作。