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

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

4

3 回答 3

4

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

如果你这样做:

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

表的长度 ,#someTable仍然是3。为什么?因为 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 回答
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 回答
1

问题是你使用“”。您的表t包含一堆numbers,并且您正在输入一个字符串作为键。您想遍历表格并执行...您没有特别明确定义的事情。但是,您不能在迭代时添加到表中,因此您可能需要做一些有趣的事情。

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

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

于 2011-06-18T21:20:35.307 回答