Lua中的嵌套表和数值键

我不确定是否可能由于数字索引,但希望有人能指导我方向。

给定以下表格:

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

如何使用数字嵌套表格?

` t [“200”] = {“东西”,“更多东西”,“甚至更多的东西”} `

似乎行不通,因为它会创建一个位置200并用null填充空单元格。我会添加字母作为后缀/前缀,但问题在于尝试按数字对表进行排序。这是否可能,还是我被困在不同的方法中?谢谢!

由于实现的轻微编辑:

` t [“200”] = {“东西”,“更多东西”,“甚至更多的东西”} `

实际上创建了一个键为“200”的键,而:

` t [200] = {“东西”,“更多东西”,“甚至更多的东西”} `

创建索引为200的其余内容均为空。

原文链接 https://stackoverflow.com/questions/6398939

点赞
stackoverflow用户298661
stackoverflow用户298661

问题在于你使用了 ""。你的表t包含一些 _数字_,而你正在输入一个 字符串 作为键。你想要遍历表并做一些......你没有特别定义的事情。然而,在迭代表时不能向表中添加内容,所以可能需要做一些有趣的事情。

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

这将为 newt 中的每个 t 表中的值创建一个表条目,其中键是表t中的值。

2011-06-18 21:20:35
stackoverflow用户734069
stackoverflow用户734069

首先,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` 包含表中的条目
end

嵌套表没有任何区别;只需要获得表即可。

local nestedTable = {"first", "second", "third", ...}
nestedTable[#nestedTable + 1] = {"newFirst", "newSecond", ...}
local aTable = nestedTable[#nestedTable];
for i, value in ipairs(aTable) do
    -- `value` 包含表中的条目
end

或者你可以只需要 ipairs(nestedTable[#nestedTable])。请注意,在这里使用的特定键(整数值)完全不重要。该键可以是字符串、浮点数、另一个表、某个用户数据等。毫无差别。

注意,我们使用 ipairs,因为我们只想遍历表的数组成员。数组的长度在上面已经定义。如果我们想要循环遍历表的每个成员,我们将使用 pairs 而不是 ipairs。当然,pairs 进行的是无序搜索,所以不能保证是按数组顺序的。

如果你想要递归查找嵌套表中的每个元素,可以使用以下代码:

local function RecursiveSearch(aTable)
    for key, value in pairs(aTable) do --无序搜索
        if(type(value) == "table") then
            RecursiveSearch(value)
        else
            --执行某些操作
        end
    end
end

请注意,上述代码可能会进入无限循环,因为表可能具有循环引用:

local tableA = {}
local tableB = {tableA}
local tableA[1] = tableB
RecursiveSearch(tableA) -- 无限循环。
2011-06-18 21:51:10
stackoverflow用户573255
stackoverflow用户573255

也许把你的任务看作是这样的会有帮助:

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

要更改当前的 200(即 t[2]),你可以这样做:

t[2] = {"一些东西""更多的东西""甚至更多的东西"}

编辑后,你的表会变成这样:

t = { [1] = 13, [2] = {"一些东西", "更多的东西", "甚至更多的东西"}, [3] = 12, [4] = 15, [5] = 23 }
-- 或者,等价于:
t = { 13, {"一些东西", "更多的东西", "甚至更多的东西"}, 12, 15, 23 }
2011-06-18 22:14:49