2015-01-09 4 views
5

원래 테이블을 변경하지 않고 하위 테이블이 적은 Lua 테이블을 두 테이블로 분할하는 방법은 무엇입니까?하위 테이블을 포함하는 Lua 테이블을 분할하는 방법

예컨대 tbl = {{tbl1}, {tbl2}, {tbl3}, {tbl4}}subtbl1 = {{tbl1}, {tbl2}}으로, subtbl2 = {{tbl3}, {tbl4}}을으로 변경하지 마십시오.

문자열에 string.sub이 있지만 테이블에 유사한 문자가 있는지 여부는 알 수 없습니다. 나는 내 생각에 unpack이 작동하지 않는다고 생각한다. table.remove은 원래 tbl으로 바뀔 것이다.

내 진짜 사건에 대한 자세한 내용은 추가 :

tbl 실행시 하위 테이블과 하위 테이블의 변경 횟수로 가득 차있다. 첫 번째 2 개의 하위 테이블을 유지하고 나머지 테이블 (한 테이블에 있음)을 함수에 전달하려고합니다.

+0

두 번째 함수는 인덱스 1에서 시작하는 테이블 테이블을 필요로합니까? 'tbl'에 * 처음 * 두 개의 서브 테이블을 포함시키고 싶습니까? –

+0

예, 두 번째 함수는 인덱스 1에서 시작하는 테이블 테이블을 예상합니다. 그러나 처음 두 개의 하위 테이블은 테이블로 필요하지 않습니다. 첫 번째 두 개의 하위 테이블에서 정보를 검색하면됩니다. – mile

답변

6

당신은 방법 LHF 제안 사용하여 첫 번째 두 개의 하위 테이블을 유지할 수 있습니다. 나머지 서브 테이블 unpack 수 있습니다.

local unpack = table.unpack or unpack 

local t = { {1}, {2}, {3}, {4}, {5}, {6} } 

local t1 = { t[1], t[2] } -- keep the first two subtables 
local t2 = { unpack(t, 3) } -- unpack the rest into a new table 

-- check that t has been split into two sub-tables leaving the original unchanged 
assert(#t == 6, 't has been modified') 

-- t1 contains the first two sub-tables of t 
assert(#t1 == 2, 'invalid table1 length') 
assert(t[1] == t1[1], 'table1 mismatch at index 1') 
assert(t[2] == t1[2], 'table1 mismatch at index 2') 

-- t2 contains the remaining sub-tables in t 
assert(#t2 == 4, 'invalid table2 length') 
assert(t[3] == t2[1], 'table2 mismatch at index 1') 
assert(t[4] == t2[2], 'table2 mismatch at index 2') 
assert(t[5] == t2[3], 'table2 mismatch at index 3') 
assert(t[6] == t2[4], 'table2 mismatch at index 4') 
+1

'unpack'은 시작과 끝 인덱스에 대한 인수를 지원하며'select'가 필요 없습니다. 그냥'풀기 (t, 3)'. –

+0

@EtanReisner 의견을 보내 주셔서 감사합니다. 내 대답을 업데이트하여 제안을 반영했습니다. – Adam

+0

감사합니다! {unpack (t, 3)}은 내 경우에 아주 좋습니다. – mile

2

이 시도 :

subtbl1 = { tbl[1], tbl[2] } 
subtbl2 = { tbl[3], tbl[4] } 
+0

감사합니다.하지만 제 경우는 더욱 복잡합니다. 내가 가진 실제 사례는 원래 tbl이 런타임에 서브 테이블로 채워진다는 것입니다. 목표는 첫 번째 2를 제외한 나머지 서브 테이블을 함수에 전달하고 처음 2 개의 하위 테이블이 다른 곳에서 사용되므로 원래 테이블이 채워진 후에 수정되지 않을 것으로 예상됩니다. – mile