2013-02-01 48 views
0

我在Lua 2個功能,營造出字典表,並允許檢查一個詞是否存在:如何獲得一個表的第x鍵在Lua

local dictTable = {} 
local dictTableSize = 0 

function buildDictionary() 
    local path = system.pathForFile("wordlist.txt") 
    local file = io.open(path, "r") 
    if file then 
     for line in file:lines() do 
      dictTable[line] = true 
      dictTableSize = dictTableSize + 1 
     end  
     io.close(file) 
    end 
end 

function checkWord(word) 
    if dictTable[word] then 
     return(true) 
    else 
     return(false) 
    end 
end 

現在我希望能夠產生一對夫婦的隨機單詞。但由於單詞是關鍵字,因此給定dictTableSize,我怎麼能選擇一些單詞。

感謝

+2

off topic,但你的checkWord函數可能只是一行:'返回dictTable [word ] == TRUE' –

+1

或'返回dictTable [文字]' –

+0

我加入了比較真實的避免返回尼爾斯 –

回答

1

只需添加一個數字索引的每個單詞的字典,同時加載它:

function buildDictionary() 
    local path = system.pathForFile("wordlist.txt") 
    local file = io.open(path, "r") 
    if file then 
     local index = 1 
     for line in file:lines() do 
      dictTable[line] = true 
      dictTable[index] = line 
      index = index + 1 
     end  
     io.close(file) 
    end 
end 

現在,你可以得到一個隨機詞是這樣的:

function randomWord() 
    return dictTable[math.random(1,#dictTable)] 
end 

附註:nil在Lua條件下計算結果爲false,所以你可能checkWord這樣的:

function checkWord(word) 
    return dictTable[word] 
end 

另一個側面說明,你會得到全局命名空間的少polution如果您纏繞字典功能集成到一個對象:

local dictionary = { words = {} } 

function dictionary:load() 
    local path = system.pathForFile('wordlist.txt') 
    local file = io.open(path, 'r') 
    if file then 
     local index = 1 
     for line in file:lines() do 
      self.words[line] = true 
      self.words[index] = line 
      index = index + 1 
     end  
     io.close(file) 
    end 
end 

function dictionary:checkWord(word) 
    return self.words[word] 
end 

function dictionary:randomWord() 
    return self.words[math.random(1,#self.words)] 
end 

然後你可以說:

dictionary:load() 
dictionary:checkWord('foobar') 
dictionary:randomWord() 
+0

謝謝,添加額外的字段作爲索引完美! –

1

大概有兩種方法:你可以保持陣列用言語,只是做words[math.random(#words)]當你需要選擇一個隨機單詞(只要確保第二個是不同於第一)。

另一種方法是使用next你需要的次數:

function findNth(t, n) 
    local val = next(t) 
    for i = 2, n do val = next(t, val) end 
    return val 
end 

這將返回bfindNth({a = true, b = true, c = true}, 3)(順序是不確定的)。

您可以通過memoizing避免重複掃描的結果(在這一點上,你會更好使用第一種方式)。

+0

感謝,但是我選擇了建議增加一個額外的索引字段作爲泥。 –

0

這是一個折衷,你有使用單詞表的方式,你是。一旦你加載它,我會反轉單詞表,這樣你就可以通過索引獲得單詞的引用,如果必須的話。是這樣的:

-- mimic your dictionary structure 
local t = { 
    ["asdf"] = true, ["wer"] = true, ["iweir"] = true, ["erer"] = true 
} 

-- function to invert your word table 
function invert(tbl) 
    local t = {} 
    for k,_ in pairs(tbl) do 
     table.insert(t, k) 
    end 
    return t 
end 

-- now the code to grab random words 
local idx1, idx2 = math.random(dictTableSize), math.random(dictTableSize) 
local new_t = invert(t) 
local word1, word2 = new_t[idx1], new_t[idx2] 
-- word1 and word2 now have random words from your 'dictTable' 
+0

謝謝,但我的字典包含230.000字,它在手機上運行。所以顛倒桌子似乎不是最有效的方式。 –