2015-11-03 123 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中的表格被認爲是類似數組的,它們的索引是數值並且密集排列,不留空隙。下表中的指數將爲1, 2, 3, 4

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

當你有類似陣列的表,可以檢查它是否包含由通過表循環一定值。您可以使用循環for..inipairs函數來創建通用函數。

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

只有在表格是* sequence *的情況下才起作用,在這種情況下它是有效的。如果可能不是,請使用類似'for k,v對(表)做的事情,如果k == val然後返回true結束返回false' –

+0

正確。我認爲你的評論需要進一步解釋,特別是對於那些Lua新手。在Lua中,表可以是散列表(存儲爲稀疏數組)或數組(序列)。稀疏數組包含nils。數組的長度計算爲找到第一個零之前的元素數。這意味着不可能用一個索引或ipairs來迭代包含nils的數組。在這種情況下,有必要使用配對。也就是說,如果你知道你的表是一個數組,最好使用ipairs,因爲pair對要慢得多。 –

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

相關問題