2015-01-09 11 views
5

Wie kann ich eine Lua-Tabelle mit wenigen Untertabellen in zwei Tabellen aufteilen, ohne die ursprüngliche Tabelle zu ändern?So teilen Sie eine Lua-Tabelle mit Untertabellen

z.B. Teilen tbl = {{tbl1}, {tbl2}, {tbl3}, {tbl4}} in subtbl1 = {{tbl1}, {tbl2}}, subtbl2 = {{tbl3}, {tbl4}} während tbl unverändert zu halten.

String hat string.sub, aber weiß nicht, ob Tabelle etwas ähnliches hat. Ich glaube nicht, unpack funktioniert für meinen Fall, auch table.remove wird das Original tbl ändern.

weitere Informationen für meinen realen Fall Hinzufügen:

Die tbl mit Untertabellen zur Laufzeit und die Anzahl der Untertabellen Änderungen gefüllt. Ich möchte die ersten beiden Untertabellen für etwas behalten und den Rest der Untertabellen (in einer Tabelle) an eine Funktion übergeben.

+0

Die zweite Funktion erwartet eine Tabelle von Tabellen (beginnend mit Index 1)? Sie möchten, dass 'tbl' * nur * die ersten beiden Untertabellen enthält? –

+0

Ja, die zweite Funktion erwartet eine Tabelle mit Tabellen, die bei Index 1 beginnen. Die ersten beiden Untertabellen werden jedoch nicht als Tabelle benötigt. Ich muss nur die Informationen aus den ersten beiden Untertabellen abrufen. – mile

Antwort

6

Sie können die ersten zwei Untertabellen halten die Methode lhf Verwendung vorgeschlagen. Sie könnten dann die restlichen Sub-Tabellen 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

'entpacken' unterstützt Argumente für das Starten und Beenden von Indizes, keine Notwendigkeit für' select'. Einfach "auspacken (t, 3)". –

+0

@EtanReisner Danke für die Rückmeldung. Ich habe meine Antwort aktualisiert, um Ihren Vorschlag zu übernehmen. – Adam

+0

Danke Jungs! {unpack (t, 3)} ist großartig für meinen Fall. – mile

2

Versuchen Sie folgendes:

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

Danke, aber mein Fall ist komplizierter. Der wirkliche Fall, den ich habe, ist, dass das ursprüngliche tbl zur Laufzeit mit Untertabellen gefüllt ist. Das Ziel besteht darin, den Rest der Untertabellen mit Ausnahme der ersten 2 an eine Funktion zu übergeben, und die ersten beiden Untertabellen werden an anderer Stelle verwendet, sodass die ursprüngliche Tabelle nach dem Auffüllen nicht geändert werden kann. – mile