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すべての新しいcounter要素を0. これはLuaで可能ですか?そうでない場合、同様のことを行う最良の方法は何ですか?

たとえば、Ruby では、これは次のように Hash を宣言することによって行われます。

counter = Hash.new(0)
4

2 に答える 2

9

0 を返すように__indexメタメソッドを設定できます。counter

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 に答える