0

我在 Lua 中有 2 个函数,它们创建一个字典表并允许检查一个单词是否存在:

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,我该如何选择一些。

谢谢

4

3 回答 3

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)订单未定义)。

您可以通过记忆结果来避免重复扫描(此时您最好使用第一种方式)。

于 2013-02-01T17:31:43.570 回答
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 条件下计算为假,所以你可以这样checkWord

function checkWord(word)
    return dictTable[word]
end

另一个注意事项,如果将字典功能包装到一个对象中,则全局命名空间的污染会更少:

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()
于 2013-02-01T18:26:07.693 回答
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'
于 2013-02-01T17:34:39.097 回答