2015-01-27 4 views
1
if FirstName:GetValue() == "" 
or table.HasValue(Blocked, string.lower(FirstName:GetValue())) then 
-- Checks if the name contains any "bad" words, or nothing was typed in. 
    FirstNameCHECK = false 
    text4:SetText("Bad Name") 
    text4:SetColor(Color(255,0,0,255)) 
else 
    FirstNameCHECK = true 
    text4:SetText("Good Name") 
    text4:SetColor(Color(0,255,0,255)) 
end 

이 코드는 현재 테이블의 항목과 정확히 일치하는 문자열을 검사합니다.테이블의 항목이 포함 된 문자열 검사

삽입 된 문자열 (이름 변수)에 테이블 항목 중 하나가 포함되어 있는지 확인하도록이 코드를 어떻게 변경할 수 있습니까?

+0

전화를 사용하는 .find'] (http://www.lua.org/manual/5.2/manual.html#pdf-string.find)에서 금지 된 모든 패턴과 함께 사용하십시오. – Deduplicator

답변

1

비효율적 인 해결책은 테이블을 반복하고 각 요소에 string.find을 호출하는 것입니다. 이 방법은 모든 요소를 ​​검사해야하므로 매우 큰 테이블의 경우 매우 느려질 수 있지만 실제로 큰 데이터 세트를 다루지 않는 한 완벽 할 것입니다.

더 똑똑한 접근법은 하위 문자열로 색인화 된 중첩 테이블을 사용하는 것입니다. 예를 들어, 인덱스가 a에서 z 인 루트 테이블을 가질 수 있습니다. 당신은 당신의 단어의 첫 글자로 그 표에 색인을 붙이고 같은 구조의 다른 표를 얻습니다. 이 글자는 두 번째 글자로 색인을 붙이며, 여러분이 확인하고있는 글자에서 더 이상 표를 찾지 못하거나 단어의 끝에 도달 할 때까지 계속됩니다. 후자의 경우, 찾고있는 정확한 단어가 표에 있는지 여부를 나타내는 추가 고유 항목이 필요할 수 있습니다 (더 이상 문자가 없으므로이를 어떻게 든 검사 할 수 있어야합니다).

이 접근법에는 몇 가지 단점이 있습니다. 테이블을 구축하는 것은 매우 메모리 집약적 일 수 있으며 검사를 수행하는 것이 작은 테이블에 대한 순진 접근보다 느릴 수도 있습니다. 또한 조회 테이블을 조작하는 것이 그리 간단하지는 않습니다 (예를 들어 단어를 제거하는 것에 대해 생각해보십시오). 따라서 이런 종류의 구조는 실제로 조회를 수행하는 데 유용하며 다른 작업을 위해 일반 테이블을 사용해야합니다.

예를 들어, 데이터 테이블의 모든 일치하는 항목을 특정 접두어 문자열에서 가져올 수있는 실제 데이터 테이블의 항목에 대한 참조 목록을 조회 테이블에서 유지 관리 할 수 ​​있습니다.

+0

LUA의 초보자입니다. 비효율적 인 솔루션에 대한 코드 샘플을 보유 할 수 있습니까? 테이블이 그렇게 크지는 않습니다 ... – SirMeepington

0

은 (다차원 테이블 작동) 다른 문제의 물건을 그런 종류의 솔루션을 제작 - Loop until find 2 specific values in a table?

function MultiTableSearch(input,value,case,index_check) 
    if (input and type(input) == 'table') then 
     if (type(value) == 'table' and value == input) then 
      return true; 
     end 
     for key,object in pairs(input) do 
      if (index_check) then 
       if (case and type(input)=='string' and type(key)=='string') then 
        if (value:lower() == key:lower()) then -- to avoid exit the loop 
         return true; 
        end 
       else 
        if (key == value) then 
         return true 
        elseif(type(object)=='table') then 
         return MultiTableSearch(object,value,case,index_check) 
        end 
       end 
      else 
       if (case and type(value)=='string' and type(object) == 'string') then 
        if (value:lower() == object:lower()) then 
         return true; 
        end 
       elseif(type(object)=='table') then 
        if (value == object) then 
         return true; 
        else 
         return MultiTableSearch(object,value,case) 
        end 
       else 
        if (object == value) then 
         return true; 
        end 
       end 
      end 
     end 
    end 
    return false; 
end 

와 [`문자열을 살펴보십시오이

MultiTableSearch(blocked,FirstName:GetValue(),true) -- table,name,case(true to ignore case)