2014-11-14 4 views
3

실제 데이터베이스를 사용할 수없는 환경에서 구조와 같은 관계형 데이터베이스를 요구하는 프로젝트가 있습니다. 언어는 루아로 제한되어 있습니다. 루아는 내 언어가 가장 먼 언어입니다. 다음과 같은 구조의 테이블이 있습니다.Lua 테이블 값을 검색하는 방법

table={ 
    m:r={ 
    x=1 
    y=1 
    displayName="Red" 
    } 
    m:y={ 
    x=1 
    y=2 
    displayName="Yellow" 
    } 
} 

테이블을 작성, 저장 및 검색하는 것은 간단합니다. 문제가있는 곳에서 검색하고 있습니다. 나는 SQL을 사용할 수 있는지 명확하게하기 위해, 나는이 작업을 수행 할 것입니다 : 내가 이런 식으로 검색하게됩니다 루아 기능

SELECT * FROM table WHERE displayName="Red" 

있습니까?

local t={ 
    r={ 
    x=1, 
    y=1, 
    displayName="Red", 
    }, 
    y={ 
    x=1, 
    y=2, 
    displayName="Yellow", 
    }, 
} 
for key, value in pairs(t) do 
    if value.displayName == 'Red' then 
    print(key) 
    end 
end 

이 'R'을 인쇄해야합니다 :

+0

테이블을 반복해야합니다. – hjpotter92

답변

2

똑 바른 방법은 모든 요소를 ​​반복하고 기준과 일치 하나를 찾는 것입니다.

큰 테이블에서는 상당히 느릴 수 있습니다. 이 프로세스의 속도를 높이려면 훨씬 빠른 액세스를 제공하는 hash의 참조를 추적 할 수 있습니다. 이런 식으로 작동 할 수 있습니다.

local cache = {} 

local function findValue(key) 
    if cache[key] == nil then 
    local value 
    -- do a linear search iterating through table elements searching for 'key' 
    -- store the result if found 
    cache[key] = value 
    end 
    return cache[key] 
end 

테이블의 요소가 값을 변경하면 값을 업데이트하거나 제거 할 때 캐시를 무효화해야합니다.

0

테이블을 검색하기위한 기본 제공 함수가 없습니다. 복잡성과 효율성이 다른 여러 가지 방법이 있습니다.

local t = { 
    r={displayname="Red", name="Ruby", age=15, x=4, y=10}, 
    y={displayname="Blue", name="Trey", age=22, x=3, y=2}, 
    t={displayname="Red", name="Jack", age=20, x=2, y=3}, 
    h={displayname="Red", name="Tim", age=25, x=2, y=33}, 
    v={displayname="Blue", name="Bonny", age=10, x=2, y=0} 
} 

Programming in Lua에서 효율적인 검색을 위해 역 표를 만드는 것이 좋습니다.

revDisplayName = {} 
for k,v in pairs(t) do 
     if revDisplayName[v.displayname] then 
      table.insert(revDisplayName[v.displayname], k) 
     else 
     revDisplayName[v] = {k} 
     end 
end 

그런 다음 표시 이름을 일치시킬 수 있습니다 쉽게

for _, rowname in pairs(revDisplayName["Red"]) do 
    print(t[rowname].x, t[rowname].y) 
end 

복잡한 쿼리를 작성하려는 경우 Beginning Lua Programming에, 루아 테이블에 루아에서 SQL과 유사한 쿼리를 생성하는 코드가 있습니다.

당신이 추상적 인 탐색 사용 할 수

그냥 일치하는 몇 가지 기록을 검색하려면, 당신과 같이 사용할 수있는 iterator in Lua

function allmatching(tbl, kvs) 
    return function(t, key) 
    repeat 
     key, row = next(t, key) 
     if key == nil then 
     return 
     end 
     for k, v in pairs(kvs) do 
     if row[k] ~= v then 
      row = nil 
      break 
     end 
     end 
    until row ~= nil 
    return key, row 
    end, tbl, nil 
end 

:

for k, row in allmatching(t, {displayname="Red", x=2}) do 
    print(k, row.name, row.x, row.y) 
end 

를 인쇄하는
h Tim  2 33 
t Jack 2 3 
관련 문제