2015-11-03 18 views
6

Mam tę tablicę, z pewnymi wartościami (int) i chcę sprawdzić, czy wartość podana przez użytkownika jest równa wartości w tym ciągu. Jeśli tak, wypisz komunikat "Got your string".Sprawdź, czy tablica zawiera konkretną wartość

Przykład listy:

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

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

Jak można to zrobić?

+1

czy zamierzasz za 'op' być tablicą podobny stół _containing_ tablicy podobny tabele z numerami w każdym z pierwszych wskaźników, lub szukasz' op = {19, 18, 17} '? – Oka

Odpowiedz

13

Lua nie ma ścisłych, takich jak tablice innych językach - ma tylko tabele mieszania. Tabele w Lua są traktowane jako w postaci tablicowych, takich jak, gdy ich indeksy są liczbowo i gęsto upakowane, nie pozostawiając żadnych przerw. Indeksy w poniższej tabeli będą następujące: 1, 2, 3, 4.

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

Kiedy masz tablicę array-jak można sprawdzić, czy zawiera on pewną wartość przez pętli przez stół. Można użyć pętli for..in i funkcji ipairs, aby utworzyć funkcję ogólną.

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

    return false 
end 

Możemy wykorzystywać powyższe w sposób if warunkowy, aby nasz wynik.

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

Aby powtórzyć mój komentarz powyżej, Twój obecny przykładowy kod nie jest tablicową tablicą liczb. Zamiast tego jest tablica tablicowa, która zawiera tablice tablicowe, które mają numery w każdym z ich pierwszych indeksów. Musisz zmodyfikować powyższą funkcję, aby pracować z pokazanym kodem, czyniąc go mniej ogólnym.

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 nie jest językiem bardzo dużym lub złożonym, a jego składnia jest bardzo jasna. Jeśli powyższe pojęcia są dla ciebie całkowicie obce, musisz poświęcić trochę czasu na czytanie prawdziwej literatury, a nie tylko kopiowanie przykładów. Radziłbym przeczytać Programming in Lua, aby upewnić się, że rozumiesz podstawy. To pierwsza edycja, skierowana do Lua 5.1.

3

Tabela op twojego pytania jest w rzeczywistości tablicą (tablicą) tablic.

Aby sprawdzić, czy wartość istnieje w tabeli:

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

Działa to tylko wtedy, gdy tabela jest * sekwencją *, którą jest w tym przypadku. Jeśli nie, użyj czegoś takiego jak 'dla k, v w parach (tabela), jeśli k == val, a następnie return true end return false' –

+0

Dobrze. Myślę, że twój komentarz wymaga dalszych wyjaśnień, szczególnie dla tych, którzy są nowi w Lua.W Lua tabela może być tablicą haszującą (przechowywaną jako tablica rzadka) lub tablicą (sekwencją). Sparse array zawiera nils. Długość tablicy jest obliczana jako liczba elementów, dopóki nie zostanie znaleziona pierwsza zero. Oznacza to, że nie jest możliwe powtórzenie tablicy zawierającej nils z indeksem lub literami. W takim przypadku konieczne jest użycie par. To powiedziawszy, jeśli wiesz, że twój stół jest tablicą, lepiej jest używać kartek, ponieważ pary są znacznie wolniejsze. –

6

Można również sprawdzić, czy wartość w macierzy jest bardziej wydajna, przenosząc wartości do indeksu i przypisując im wartość rzeczywistą.

Wtedy, kiedy sprawdzić tabelę po prostu sprawdzić, czy istnieje wartość tego wskaźnika, który pozwoli Ci zaoszczędzić trochę czasu, ponieważ nie trzeba przejść przez cały stół w najgorszym przypadku ...

Oto przykład miałem na myśli:

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


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

Nie ma potrzeby, aby 'op [19] == true'. Może to być po prostu "op [19]" – timbo