2015-11-03 2 views
6

У меня есть этот массив с некоторыми значениями (int), и я хочу проверить, равно ли значение, заданное пользователем, значение в этой строке. Если это так, выведите сообщение типа «Получил вашу строку».Проверьте, содержит ли массив определенное значение

Пример списка:

local op = { 
{19}, 
{18}, 
{17} 
} 

if 13 == (the values from that array) then 
    message 
else 
    other message 

Как это можно сделать?

+1

ли вы собираетесь для 'op' быть массивом типа таблицы _containing_ массивов, как таблицы с числами в каждом из первых индексов, или вы ищете' ор = {19, 18, 17} '? – Oka

ответ

13

Lua не имеет строгих массивов, как и другие языки - это только имеет хэш-таблицы. Таблицы в Lua считаются array-like, когда их индексы численно и плотно упакованы, не оставляя пробелов. Индексы в следующей таблице: 1, 2, 3, 4.

local t = {'a', 'b', 'c', 'd'} 

Если у вас есть массив типа таблицы, вы можете проверить, если он содержит определенное значение по обхвата через стол. Вы можете использовать цикл for..in и функцию ipairs для создания общей функции.

local function has_value (tab, val) 
    for index, value in ipairs(tab) do 
     if value == val then 
      return true 
     end 
    end 

    return false 
end 

Мы можем использовать выше, в if условно, чтобы получить наш результат.

if has_value(arr, 'b') then 
    print 'Yep' 
else 
    print 'Nope' 
end 

Чтобы повторить мой комментарий выше, ваш текущий примерный код не является таблицей чисел, подобной массиву. Вместо этого это массив, подобный таблице , содержащий массивные таблицы, у которых есть числа в каждом из своих первых индексов. Вам нужно будет изменить функцию выше, чтобы работать с вашим отображаемым кодом, делая его менее общим.

local function has_value (tab, val) 
    for index, value in ipairs(tab) do 
     -- We grab the first index of our sub-table instead 
     if value[1] == val then 
      return true 
     end 
    end 

    return false 
end 

Lua не очень большой или сложный язык, и его синтаксис очень четкий. Если приведенные выше концепции совершенно вам чужды, вам нужно потратить некоторое время на чтение настоящей литературы, а не только на копирование примеров. Я бы посоветовал прочитать Programming in Lua, чтобы убедиться, что вы понимаете самые основы. Это первое издание, предназначенное для Lua 5.1.

3

Таблица op вашего вопроса на самом деле представляет собой массив (таблицу) массивов.

Чтобы проверить, существует ли значение в таблице:

local function contains(table, val) 
    for i=1,#table do 
     if table[i] == val then 
     return true 
     end 
    end 
    return false 
end 

local table = {1, 2, 3} 
if contains(table, 3) then 
    print("Value found") 
end 
+0

Это работает только в том случае, если таблица представляет собой * последовательность *, которая в этом случае. Если это может быть не так, используйте что-то вроде 'для k, v в парах (table), если k == val then return true end return false' –

+0

Вправо. Я думаю, что ваш комментарий требует дальнейшего объяснения, особенно для тех, кто не знаком с Lua.В Lua таблица может быть либо хеш-таблицей (хранимой как разреженный массив), либо массивом (последовательностью). Редкий массив содержит nils. Длина массива вычисляется как количество элементов до тех пор, пока не будет найдено первое значение nil. Это означает, что невозможно выполнить итерацию массива, содержащего nils с индексом или ipairs. В этом случае необходимо использовать пары. Тем не менее, если вы знаете, что ваша таблица представляет собой массив, лучше использовать ipairs, поскольку пары намного медленнее. –

6

Вы также можете проверить, существует ли значение в вашем массиве более эффективно, перемещая значения в индекс и присваивая им истинное значение.

Затем, когда вы проверяете таблицу вы просто проверить, если значение существует на этот индекс, который поможет вам сэкономить время, потому что вам не нужно ехать через весь стол в худшем случае ...

Вот пример, который я имел в виду:

local op = { 
[19]=true, 
[18]=true, 
[17]=true 
} 


if op[19] == true then 
    print("message") 
else 
    print("other message") 
end 
+0

Нет необходимости в 'op [19] == true'. Это может быть просто 'op [19]' – timbo

Смежные вопросы