初学者lua:检查数组的值

时间:2018-11-06 07:17:36

标签: lua

我需要生成一个随机数,然后检查以查看该数字在哪些表(数组)中作为值列出。检查完成后,我需要输出显示数字的表。

例如,将生成一个1到21之间的随机数,然后在其他数字表中进行搜索。

evens = {2,4,6,8,10,12,14,16,18,20}
odds = {1,3,5,7,9,11,13,15,17,19,21}
low = {1,2,3,4,5,6,7}
med = {8,9,10,11,12,13,14}
high = {15,16,17,18,19,20,21}

如果随机数为17,则需要输出“ odds”和“ high”。

3 个答案:

答案 0 :(得分:0)

不需要检查奇数表,并且进入范围更容易检查限制:

local low = {1,2,3,4,5,6,7}
local med = {8,9,10,11,12,13,14}
local high = {15,16,17,18,19,20,21}

local n = 33
local function CheckNum(n)
    local tab_type = 'unknown'
    if n  >= 1 and n <=7 then tab_type = "low"
    elseif n  >= 8 and n <=14  then tab_type = "med"
    elseif n  >= 15 and n <=21 then tab_type = "high"   
    end
    local odd = (n%2==0) and "even" or "odd" 
    return odd,  tab_type
end

local odd,  tab_type = CheckNum(n)
print ( odd, " ", tab_type )

答案 1 :(得分:0)

我可以提供的最通用的解决方案是构建inverted index之类的东西。您只需要在表格中为每个可能的术语(在您的情况下为数字)创建一条记录。此类表中的值表示可以在其中找到术语的数组。 代码如下所示:

local evens = { 2, 4, 6, 8, name = 'evens'}
local odds = {1, 3, 5, 7, name = 'odds'}
local low = { 1, 2, 3, 4, name = 'low'}
local high = {15, 16, 17, 18, 19, name = 'high'}

local inv_index = {}

function add_to_index(index, numbers)
    for i, number in ipairs(numbers) do
            local indexed = index[number]
            if not indexed then
                    index[number] = { numbers }
            else
                    table.insert(indexed, numbers)
            end
    end
end

add_to_index(inv_index, evens)
add_to_index(inv_index, odds)
add_to_index(inv_index, low)
add_to_index(inv_index, high)

-- which arrays contains the number "4"?
for k, indexed in pairs(inv_index[4]) do
    print(indexed.name) -- prints "evens" and "low"
end

此解决方案的缺点是内存消耗,尤其是在可能的数字数量很大的情况下。另一种方法是对每个数组排序并对其执行binary search。 lua有一个implementation

如果您可以修改数组,则可以将数字存储在某种类型的集合中:

local evens = { [2] = true, [4] = true, [6] = true, [8] = true }
local low = { [1] = true, [2] = true, [3] = true, [4] = true }
local odds = { [1] = true, [3] = true , [5] = true, [7] = true }

local x = 4

print(evens[x] ~= nil) -- true
print(low[x] ~= nil) -- true
print(odds[x] ~= nil) -- false

答案 2 :(得分:0)

我找到了一个函数来检查列表中的值:

function contains(list, x)
    for _, v in pairs(list) do
        if v == x then return true end
    end
    return false
end

这是一个如何使用它的示例:

alist={'abc',123}
if contains(alist,'abc')
    print('abc is in the list alist')
end