8

我想获得字符串中最常见的 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

这条线counter[subs] = (counter[subs] and counter[subs] + 1 or 1)的均值相同 counter[subs] = (counter[subs] ? counter[subs]+1 : 1)。这条线只有counter[subs] = counter[subs] + 1当我们可以counter0. 这在Lua中可能吗?如果没有,做类似事情的最佳方法是什么?

例如,在 Ruby 中,这是通过像这样声明一个 Hash 来完成的:

counter = Hash.new(0)
4

2 回答 2

9

您可以设置一个__index元方法counter以返回 0:

setmetatable(counter,{__index=function () return 0 end})

但这更容易和更清楚:

counter[subs] = (counter[subs] or 0) + 1
于 2013-11-05T11:15:04.293 回答
0

对于您的情况,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
于 2013-11-05T15:52:24.340 回答