Самое общее решение, которое я могу предложить, - это создать что-то вроде инвертированный индекс . Вам просто нужно создать запись в таблице для каждого возможного термина (число, в вашем случае). Значения в такой таблице представляют собой массивы, в которых вы можете найти свой термин.
Код может выглядеть так:
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
Недостатком этого решения является потребление памяти, особенно если число возможных чисел велико. Альтернативой является сортировка каждого массива и выполнение бинарного поиска . Существует реализация для lua.
Если вы можете изменить свои массивы, вы можете просто хранить числа в некотором наборе:
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