2015-01-09 6 views
5

元のテーブルを変更せずに、サブテーブルがほとんどないLuaテーブルを2つのテーブルに分割する方法を教えてください。サブテーブルを含むLuaテーブルを分割する方法

変わらないtblを維持しながら、 はsubtbl1 = {{tbl1}, {tbl2}}tbl = {{tbl1}, {tbl2}, {tbl3}, {tbl4}}subtbl2 = {{tbl3}, {tbl4}}を分割します。

文字列string.subを持っていますが、テーブルには似た何かを持っているかどうかを知りません。私はunpack私の場合のために働くとは思わない、またtable.removeは、元tblを変更します。

私の実際のケースのためのより多くの情報を追加:

tbl実行時にサブテーブルとサブテーブルの変更の数が充填されています。最初の2つのサブテーブルを何かのために保持し、残りのサブテーブルを1つのテーブルに関数に渡したいとします。

+0

第2の関数は、テーブルのインデックス(インデックス1から)を必要としますか? 'tbl'に最初の2つのサブテーブルを入れるだけですか? –

+0

はい、2番目の関数はインデックス1から始まるテーブルのテーブルを必要としますが、最初の2つのサブテーブルはテーブルとして必要ありません。私は最初の2つのサブテーブルから情報を取得する必要があります。 – mile

答えて

6

あなたはLHFが提案された方法を用いて、第1の2のサブテーブルを維持することができます。残りのサブテーブルは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'の必要はありません。ちょうど 'unpack(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

関連する問題