问题
ORIGINAL POST
Given that there is no built in function in Lua, I am in search of a function that allows me to append tables together. I have googled quite a bit and have tried every solutions I stumbled across but none seem to work properly.
The scenario goes like this: I am using Lua embeded in an application. An internal command of the application returns a list of values in the form of a table.
What I am trying to do is call that command recursively in a loop and append the returned values, again in the form of a table, to the table from previous iterations.
EDIT
For those who come across this post in the future, please note what @gimf posted. Since Tables in Lua are as much like arrays than anything else (even in a list context), there is no real correct way to append one table to another. The closest concept is merging of tables. Please see the post, "Lua - merge tables?" for help in that regard.
回答1:
Overcomplicated answers much?
here is my implementation:
function TableConcat(t1,t2)
for i=1,#t2 do
t1[#t1+1] = t2[i]
end
return t1
end
回答2:
To add two tables together do this
ii=0
for i=#firsttable, #secondtable+#firsttable do
ii=ii+1
firsttable[i]=secondtable[ii]
end
use the first table as the variable you wanted to add as code adds the second one on to the end of the first table in order.
i
is the start number of the table or list.#secondtable+#firsttable
is what to end at.
It starts at the end of the first table you want to add to, and ends at the end of the second table in a for
loop so it works with any size table or list.
回答3:
In general the notion of concatenating arbitrary tables does not make sense in Lua because a single key can only have one value.
There are special cases in which concatenation does make sense. One such is for tables containing simple arrays, which might be the natural result of a function intended to return a list of results.
In that case, you can write:
-- return a new array containing the concatenation of all of its -- parameters. Scaler parameters are included in place, and array -- parameters have their values shallow-copied to the final array. -- Note that userdata and function values are treated as scalar. function array_concat(...) local t = {} for n = 1,select("#",...) do local arg = select(n,...) if type(arg)=="table" then for _,v in ipairs(arg) do t[#t+1] = v end else t[#t+1] = arg end end return t end
This is a shallow copy, and makes no attempt to find out if a userdata
or function value is a container or object of some kind that might need different treatment.
An alternative implementation might modify the first argument rather than creating a new table. This would save the cost of copying, and make array_concat
different from the ..
operator on strings.
Edit: As observed in a comment by Joseph Kingry, I failed to properly extract the actual value of each argument from ...
. I also failed to return the merged table from the function at all. That's what I get for coding in the answer box and not testing the code at all.
回答4:
A simple way to do what you want:
local t1 = {1, 2, 3, 4, 5}
local t2 = {6, 7, 8, 9, 10}
local t3 = {unpack(t1)}
for I = 1,#t2 do
t3[#t1+I] = t2[I]
end
回答5:
And one more way:
for _,v in ipairs(t2) do
table.insert(t1, v)
end
It seems to me the most readable one - it iterates over the 2nd table and appends its values to the 1st one, end of story. Curious how it fares in speed to the explicit indexing [] above
回答6:
If you want to merge two tables, but need a deep copy of the result table, for whatever reason, use the merge from another SO question on merging tables plus some deep copy code from lua-users.
(edit Well, maybe you can edit your question to provide a minimal example... If you mean that a table
{ a = 1, b = 2 }
concatenated with another table
{ a = 5, b = 10 }
should result in
{ a = 1, b = 2, a = 5, b = 10 }
then you're out of luck. Keys are unique.
It seems you want to have a list of pairs, like { { a, 1 }, { b, 2 }, { a, 5 }, { b, 10 } }
. You could also use a final structure like { a = { 1, 5 }, b = { 2, 10 } }
, depending on your application.
But the simple of notion of "concatenating" tables does not make sense with Lua tables. )
回答7:
Here is an implementation I've done similar to RBerteig's above, but using the hidden parameter arg which is available when a function receives a variable number of arguments. Personally, I think this is more readable vs the select syntax.
function array_concat(...)
local t = {}
for i = 1, arg.n do
local array = arg[i]
if (type(array) == "table") then
for j = 1, #array do
t[#t+1] = array[j]
end
else
t[#t+1] = array
end
end
return t
end
回答8:
Here is my implementation to concatenate a set of pure-integer-indexing tables, FYI.
- define a function to concatenate two tables,
concat_2tables
another recursive function
concatenateTables
: split the table list byunpack
, and callconcat_2tables
to concatenatetable1
andrestTableList
t1 = {1, 2, 3} t2 = {4, 5} t3 = {6} concat_2tables = function(table1, table2) len = table.getn(table1) for key, val in pairs(table2)do table1[key+len] = val end return table1 end concatenateTables = function( tableList ) if tableList==nil then return nil elseif table.getn(tableList) == 1 then return tableList[1] else table1 = tableList[1] restTableList = {unpack(tableList, 2)} return concat_2tables(table1, concatenateTables(restTableList)) end end tt = {t1, t2, t3} t = concatenateTables(tt)
回答9:
If you want to concatenate an existing table to a new one, this is the most concise way to do it:
local t = {3, 4, 5}
local concatenation = {1, 2, table.unpack(t)}
Although I'm not sure how good this is performance-wise.
来源:https://stackoverflow.com/questions/1410862/concatenation-of-tables-in-lua