Lua中的嵌套表和数字键

时间:2011-06-18 21:15:08

标签: lua nested lua-table

由于数字指数,我不确定这是否可行,但希望有人能指出我正确的方向。

鉴于以下表格:

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

创建索引200,其他所有内容为null。

3 个答案:

答案 0 :(得分:4)

首先,DeadMG是正确的;你使用的是字符串而不是数字索引。但是,即使您确实使用了数字索引,也无济于事。

如果你这样做:

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

表格#someTable的长度仍为 3 。为什么?因为Lua基于连续元素在表中定义数组。记住:你可以访问任何表格的任何元素;它们在概念上都用nil填充,直到你给它们一个实际值。

如果从数字索引1开始计数直到达到第一个nil值,则Lua将表的长度定义为表中值的数量。由于someTable[4]为零,因此长度为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];     对于我,ipairs(aTable)中的值          - value包含表格中的条目。     端

或者您可以ipairs(nestedTable[#nestedTable])。请注意,此处使用的特定键(整数值)完全不重要。该密钥可能是一个字符串,一个浮点数,另一个表,一些用户数据等。这没关系。

另请注意,我们使用ipairs因为我们只想迭代表的数组成员。数组的长度如上所述。如果我们想要遍历表中的每个成员,我们将使用pairs而不是ipairs。当然,pairs执行无序搜索,因此无法保证按数组顺序排列。

如果要递归查找嵌套表中的每个元素,可以执行以下操作:

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

请注意,上面的内容可以执行无限循环,因为表可以使用循环引用:

local tableA = {}
local tableB = {tableA}
local tableA[1] = tableB
RecursiveSearch(tableA) --Infinite loop.

答案 1 :(得分:3)

或许查看您的作业可能会有所帮助:

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 }

答案 2 :(得分:1)

问题在于您使用“”。您的表格t包含一堆数字,您输入的是字符串作为密钥。你想迭代表并做...你没有特别好定义的东西。但是,你不能在迭代时添加到表中,所以你可能需要做一些有趣的事情。

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

这将在newt中创建一个表条目,其中键是表t中的值,表示t中的所有值。