40

元の投稿

Lua には組み込み関数がないため、テーブルを一緒に追加できる関数を探しています。私はかなりグーグルで検索し、遭遇したすべてのソリューションを試しましたが、どれも正しく機能していないようです.

シナリオは次のようになります。アプリケーションに組み込まれた Lua を使用しています。アプリケーションの内部コマンドは、テーブルの形式で値のリストを返します。

私がやろうとしているのは、そのコマンドをループで再帰的に呼び出し、返された値を再びテーブルの形式で前の反復からテーブルに追加することです。


編集

今後この投稿に出くわす人は、@gimf が投稿した内容に注意してください。Lua のテーブルは他の何よりも配列に似ているため (リスト コンテキストであっても)、1 つのテーブルを別のテーブルに追加する本当の正しい方法はありません。最も近い概念は、テーブルのマージです。その点については、記事「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 に答える
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

2 つのテーブルを一緒に追加するには、次のようにします。

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

コードが最初のテーブルの最後に 2 番目のテーブルを順番に追加するときに、最初のテーブルを追加する変数として使用します。

  • iテーブルまたはリストの開始番号です。
  • #secondtable+#firsttableで終わるものです。

追加する最初のテーブルの最後で開始し、ループ内の 2 番目のテーブルの最後で終了するforため、任意のサイズのテーブルまたはリストで機能します。

于 2012-04-09T10:05:39.657 に答える
4

一般に、任意のテーブルを連結するという概念は Lua では意味がありません。1 つのキーは 1 つの値しか持てないからです。

連結が意味を持つ特殊なケースがあります。そのようなものの 1 つは、結果のリストを返すことを意図した関数の自然な結果である単純な配列を含むテーブルの場合です。

その場合、次のように記述できます。

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

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. 2 つのテーブルを連結する関数を定義し、concat_2tables
  2. 別の再帰関数concatenateTables: テーブル リストを で分割しunpack、 を呼び出しconcat_2tablesて連結table1し、restTableList

    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 に答える