40

原帖

鉴于 Lua 中没有内置函数,我正在寻找一个允许我将表附加在一起的函数。我用谷歌搜索了很多,并尝试了我偶然发现的所有解决方案,但似乎没有一个能正常工作。

场景是这样的:我正在使用嵌入在应用程序中的 Lua。应用程序的内部命令以表格的形式返回值列表。

我要做的是在循环中递归地调用该命令,并将返回的值(再次以表的形式)附加到先前迭代的表中。


编辑

对于将来遇到此帖子的人,请注意@gimf 发布的内容。由于 Lua 中的表比其他任何东西都更像数组(即使在列表上下文中),所以没有真正正确的方法可以将一个表附加到另一个表。最接近的概念是合并表。请参阅帖子“ Lua - 合并表? ”以获得这方面的帮助。

4

11 回答 11

31

答案过于复杂?

这是我的实现:

function TableConcat(t1,t2)
    for i=1,#t2 do
        t1[#t1+1] = t2[i]
    end
    return t1
end
于 2013-03-07T18:00:10.930 回答
14

如果要将现有表连接到新表,这是最简洁的方法:

local t = {3, 4, 5}
local concatenation = {1, 2, table.unpack(t)}

虽然我不确定这在性能方面有多好。

于 2019-01-24T17:11:23.937 回答
11

还有一种方法:

for _,v in ipairs(t2) do 
    table.insert(t1, v)
end

在我看来,它是最易读的——它遍历第二个表并将其值附加到第一个表,故事的结尾。好奇它对上面的显式索引 [] 的速度如何

于 2015-03-20T23:36:56.017 回答
6

一种简单的方法来做你想做的事:

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
于 2015-02-23T03:27:56.920 回答
5

要将两个表添加在一起,请执行此操作

    ii=0
for i=#firsttable, #secondtable+#firsttable do
    ii=ii+1
    firsttable[i]=secondtable[ii]
end

使用第一个表作为要添加的变量,因为代码按顺序将第二个表添加到第一个表的末尾。

  • i是表格或列表的起始编号。
  • #secondtable+#firsttable是什么结束。

它从您要添加到的第一个表的末尾开始,并在for循环中的第二个表的末尾结束,因此它适用于任何大小的表或列表。

于 2012-04-09T10:05:39.657 回答
4

一般来说,连接任意表的概念在 Lua 中没有意义,因为单个键只能有一个值。

在某些特殊情况下,串联确实有意义。一种是包含简单数组的表,这可能是旨在返回结果列表的函数的自然结果。

在这种情况下,您可以编写:

-- 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

这是一个浅拷贝,不会试图找出一个userdata或函数值是否是某种容器或对象,它可能需要不同的处理。

另一种实现可能会修改第一个参数,而不是创建一个新表。这将节省复制成本,并且与字符串上array_concat的运算符不同..

编辑:正如Joseph Kingry在评论中所观察到的,我未能正确地从.... 我也根本没有从函数中返回合并表。这就是我在答案框中编码而不是测试代码所得到的。

于 2009-09-12T01:07:27.543 回答
2

如果您想合并两个表,但需要结果表的深层副本,无论出于何种原因,请使用另一个关于合并表的 SO 问题的合并以及来自lua-users 的一些深层复制代码。

(编辑 好吧,也许你可以编辑你的问题以提供一个最小的例子......如果你的意思是一个表格

 { a = 1, b = 2 }

与另一个表连接

{ a = 5, b = 10 }

应该导致

{ a = 1, b = 2, a = 5, b = 10 }

那你就不走运了。 键是唯一的。

似乎您想要一个配对列表,例如{ { a, 1 }, { b, 2 }, { a, 5 }, { b, 10 } }. 您还可以使用最终结构,例如{ a = { 1, 5 }, b = { 2, 10 } },具体取决于您的应用程序。

但是“连接”表的简单概念对于 Lua 表没有意义。 )

于 2009-09-11T14:02:52.817 回答
1

这是我完成的与上面 Rberteig 类似的实现,但使用了隐藏参数arg,当函数接收到可变数量的参数时,该参数可用。就个人而言,我认为这比 select 语法更具可读性。

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
于 2011-11-28T18:57:23.050 回答
1

这是我连接一组纯整数索引表的实现,仅供参考。

  1. 定义一个函数来连接两个表,concat_2tables
  2. 另一个递归函数concatenateTables:拆分表列表unpack,并调用concat_2tables连接table1restTableList

    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)  
    
于 2015-10-23T07:01:00.780 回答
0

使用 table.concat:

http://lua-users.org/wiki/TableLibraryTutorial

> = table.concat({ 1, 2, "three", 4, "five" })
12three4five
> = table.concat({ 1, 2, "three", 4, "five" }, ", ")
1, 2, three, 4, five
> = table.concat({ 1, 2, "three", 4, "five" }, ", ", 2)
2, three, 4, five
> = table.concat({ 1, 2, "three", 4, "five" }, ", ", 2, 4)
2, three, 4
于 2022-02-20T12:58:29.517 回答
0
-- Lua 5.1+
function TableAppend(t1, t2)
    -- A numeric for loop is faster than pairs, but it only gets the sequential part of t2
    for i = 1, #t2 do
        t1[#t1 + 1] = t2[i] -- this is slightly faster than table.insert
    end

    -- This loop gets the non-sequential part (e.g. ['a'] = 1), if it exists
    local k, v = next(t2, #t2 ~= 0 and #t2 or nil)
    while k do
        t1[k] = v -- if index k already exists in t1 then it will be overwritten
        k, v = next(t2, k)
    end
end
于 2022-01-14T19:45:16.077 回答