4

数値指数のせいでこれが可能かどうかはわかりませんが、誰かが私を正しい方向に向けてくれることを願っています。

与えられたテーブル:

t = { 13, 200, 12, 15, 23 }

数字を使用してテーブルをネストするにはどうすればよいですか?

t["200"] = {"stuff", "more stuff", "even more stuff"}

位置200を作成し、空のセルにnullを入力するため、機能していないようです。接尾辞/接頭辞として文字を追加しますが、テーブルを数値で並べ替えようとすると問題が発生します。これも可能ですか、それとも別の方法で立ち往生していますか?ありがとう!

実現によるわずかな編集:

t["200"] = {"stuff", "more stuff", "even more stuff"}

実際には「200」のキーを作成しますが、次のようになります。

t[200] = {"stuff", "more stuff", "even more stuff"}

他のすべてがnullのインデックス200を作成します。

4

3 に答える 3

4

おそらく、次のように割り当てを表示するのに役立ちます。

t = { [1] = 13, [2] = 200, [3] = 12, [4] = 15, [5] = 23 }

現在200(つまりt[2])を変更するには、次のようにします。

t[2] = {"stuff", "more stuff", "even more stuff"}

編集:その結果、テーブルは次のようになります。

t = { [1] = 13, [2] = {"stuff", "more stuff", "even more stuff"}, [3] = 12, [4] = 15, [5] = 23 }
-- or, equivalent::
t = { 13, {"stuff", "more stuff", "even more stuff"}, 12, 15, 23 }
于 2011-06-18T22:14:49.420 に答える
4

まず、DeadMG は正しいです。数値インデックスではなく文字列を使用しました。ただし、数値インデックスを使用したとしても、役に立ちません。

これを行う場合:

someTable = {"value1", "value2", {"value3a", "value3b"}};
someTable[50] = {"value50a", "value50b"};

テーブルの長さ は3#someTableのままです。なんで?Lua は、連続する要素に基づいてテーブル内の配列を定義するためです。覚えておいてください: どのテーブルのどの要素にもアクセスできます。実際の値を指定するまで、それらはすべて概念的に満たされています。nil

Lua では、数値インデックス 1 から最初の値に到達するまでカウントを開始した場合、テーブルの長さをテーブル内の値の数として定義しnilます。someTable[4]は nil なので、長さは 3 です。

配列テーブルの末尾に新しい要素を挿入する場合は、次のようにします。

someTable[#someTable + 1] = "newValue";

値自体をテーブルにすることができます。

someTable[#someTable + 1] = {"newValuea", "newValueb"};

入れ子になったテーブルにアクセスする方法を尋ねているだけなら、それは簡単で、使用するキーとは関係ありません。

ネストした表について特別なことは何もありません。テーブルは値であり、テーブル エントリは他のテーブルを含む任意の値にすることができます。

テーブルがあり、その中の配列エントリを調べたい場合は、これを使用します:

local aTable = {"first", "second", "third", ...}
for i, value in ipairs(aTable) do
    --`value` contains the entries in the table.
end

ネストした表も例外ではありません。単にテーブルを取得するだけです。

local nestedTable = { "first", "second", "third", ...}
nestedTable[#nestedTable + 1] = {"newFirst", "newSecond", ...}
local aTable = nestedTable[#nestedTable];
for i, value in ipairs(aTable) do
    --`value` contains the entries in the table.
end

または、単に行うこともできますipairs(nestedTable[#nestedTable])。ここで使用される特定のキー (整数値) はまったく重要ではないことに注意してください。そのキーは、文字列、浮動小数点数、別のテーブル、ユーザーデータなどである可能性があります。それは問題ではありません。

ipairsテーブルの配列メンバーのみを反復処理するために使用することにも注意してください。配列の長さは上で定義されています。テーブルのすべてのメンバーをループしたい場合は、pairs代わりにを使用しipairsます。もちろん、pairs順序付けされていない検索を行うため、配列順であるとは限りません。

ネストされたテーブル内のすべての要素を再帰的に検索する場合は、次のようにできます。

local function RecursiveSearch(aTable)
    for key, value in pairs(aTable) do --unordered search
        if(type(value) == "table") then
            RecursiveSearch(value)
        else
            --Do something with this.
        end
    end
end

テーブルが循環参照を持つ可能性があるため、上記は無限ループを実行できることに注意してください。

local tableA = {}
local tableB = {tableA}
local tableA[1] = tableB
RecursiveSearch(tableA) --Infinite loop.
于 2011-06-18T21:51:10.533 に答える
1

問題は「」の使用です。テーブルtにはたくさんの数字が含まれており、キーとして文字列を入力しています。あなたはテーブルを繰り返してやりたいと思っています...あなたが特にうまく定義していなかった何か。ただし、テーブルを反復処理している間はテーブルに追加できないため、面白いことをする必要があるかもしれません。

t = { 13, 200, 12, 15, 23 }
newt = {};
for key, value in pairs(t) {
    newt[value] = { }; 
}

これにより、newtにテーブルエントリが作成されます。ここで、キーはテーブルtの値であり、tのすべての値に対してです。

于 2011-06-18T21:20:35.307 に答える