【问题标题】:Lua: set every new element in table to a default valueLua:将表中的每个新元素设置为默认值
【发布时间】:2013-11-08 19:29:58
【问题描述】:

我想获取字符串中出现频率最高的 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) 相同。如果我们可以使用0 设置每个新的counter 元素,则此行将只有counter[subs] = counter[subs] + 1。这在Lua中可能吗?如果不是,那么做类似事情的最佳方法是什么?

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

counter = Hash.new(0)

【问题讨论】:

    标签: hash lua lua-table


    【解决方案1】:

    您可以在counter 中设置__index 元方法以返回0:

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

    但这更简单明了:

    counter[subs] = (counter[subs] or 0) + 1
    

    【讨论】:

      【解决方案2】:

      对于您的情况,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 来避免循环。
      • 我只使用 __index,只有当你试图获取一个值时才会调用它,并且只有在表中该键处没有项目时才会调用它。我不会覆盖写作部分,它可以正常工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      相关资源
      最近更新 更多