将带有字符串键的表值插入Lua表
我对Lua语言还比较陌生,表结构显然有一些地方我还没有掌握 我试图创建一个表的表,表中的每个表都有一个键,值是相应的表 好吧,这句话可能会让人困惑。下面是一个例子:将带有字符串键的表值插入Lua表,lua,lua-table,Lua,Lua Table,我对Lua语言还比较陌生,表结构显然有一些地方我还没有掌握 我试图创建一个表的表,表中的每个表都有一个键,值是相应的表 好吧,这句话可能会让人困惑。下面是一个例子: {{ key = "RC", value = {1, 2, 3, 4}}, { key = "M", value = {4, 8, 7}}, { key = "D", value = {3, 8, 9}} ...} 为此,我使用了以下算法: local listOfLists = {}; ... if condition
{{ key = "RC", value = {1, 2, 3, 4}},
{ key = "M", value = {4, 8, 7}},
{ key = "D", value = {3, 8, 9}}
...}
为此,我使用了以下算法:
local listOfLists = {};
...
if condition1 then
listOfLists[key1] = list1;
end
...
if condition2 then
listOfLists[key2] = list2;
end
...
等等
我希望以后使用这些键来确定哪些列表已添加到表中。
但问题是,即使所有条件都满足,表中似乎也没有添加任何列表
我可以使用table.insert(listOfLists,list1)
代替listOfLists[key1]=list1
,但这样我就无法分辨哪些列表被添加到了集合中。
蚂蚁的建议?很难理解,你想实现什么。所以,如果你想要更具体的答案,请提供更多信息 可以创建表的关联表
local map = {}
map["key"] = { 1, 2, 3, 4 }
print(map.key[3])
也可以创建一个表数组
local vector = {}
vector[1] = { 1, 2, 3, 4 }
print(vector[1][2])
或者,您可以结合各种方法
创造
{{ key = "RC", value = {1, 2, 3, 4}},
{ key = "M", value = {4, 8, 7}},
{ key = "D", value = {3, 8, 9}}
...}
您可以从代码中使用或smth
local tbl = { { key = "RC", value = {1, 2, 3, 4}} } -- init first elem from constructor
table.insert(tbl, { key = "M", value = {4, 8, 7}}) -- table insert & constructor
tbl[2] = {} -- Array-based access.
tbl[2].key = "D" --key access
tbl[2]["value"] = { 3, 8, 9 } -- other way
请注意,每个表由两部分组成:从1到N的顺序键的向量和映射。有些函数,如表长度运算符或ipairs迭代器,保证只处理表的向量部分。但它们的速度要快得多
编辑:(最后一段解释)
如果您有一个带有一些键的表,并且希望遍历它,那么可以使用iPair或pairs
ipairs
是有序的,从1到第一个非零元素。它不会迭代非整数键<代码>配对通过任何键,但不能保证顺序
local map = { 1, 2, 3, key = 6, [5] = 5 }
for i, v in ipairs(map) do
print(v) -- will output 1, 2, 3. first nil element is map[4]. map[5] will mot be visited.
end
for i, v in pairs(map) do -- NOTE pairs usage
print(v) -- will output 1, 2, 3, 5, 6 in ANY order
end
map[4] = 4 -- Fill gap
for i, v in ipairs(map) do
print(v) -- will output 1, 2, 3, 4, 5. Now first nil element is map[6]
end
长度操作符的工作原理与ipairs
类似,它不计算ipairs
方法未访问的元素
table.maxn使用数值索引,并将为您的表返回零。
参考说明table.maxn
返回给定表的最大正数值索引,如果该表没有正数值索引,则返回零。(为了完成其工作,此函数对整个表进行线性遍历。)
关于length和table.maxn的小示例
local a = { 1, 2, 3, [5] = 5}
print(table.maxn(a)) -- 5
print(#a) -- 3
a = { key = 4 }
print(table.maxn(a)) -- 0
print(#a) -- 0
print(a["key"]) -- 4, nothing is lost
local num = 0
for _, __ in pairs(a) do num = num + 1 end
print(num) -- 1 We find it.
Lua表是一种灵活的数据结构。元素是键值对。键是除
nil
之外的任何Lua值。值可以有除nil
之外的任何值。将nil
赋给该值将删除该对
表的(可能为空)子集称为序列,该表的number
类型的键值是从1到n的整数。n被确定为与nil
值配对的最后一个这样的键。一些表函数和运算符仅对序列起作用
表构造函数允许对键使用多个语法:
{1,2,3}
{[1]=1,[3]=3,[“两个”]=“值”}
{one=1,two=2}
{
RC = {1, 2, 3, 4},
M = {4, 8, 7},
D = {3, 8, 9}
}
还有一个可能的解决方案是使用
{RC={1,2,3,4},…}
这类似于您的第一个示例,但是aster执行map[“key”]={1,2,3,4}
,打印(table.maxn(map))
返回0和键,ipairs中的值(maxn)do。。。结束
也不会进入循环。我不确定我做错了什么。顺便说一句,键可以是任何字符串,当我将数字列表(基本上是标识符列表)添加到“map”时,它永远不会为空@memoryofreamipairs
仅按数字索引元素进行。从1到第一个非零元素。我将在5分钟内在答案中添加更多解释。@memoryofadream扩展了答案。查看已编辑的部分,尤其是最后一个代码示例。希望现在更清楚了。@Seagull谢谢你提供的详细信息。请注意,您提供的示例满足key1
的listOfLists[key1]=list1
形式为{key=“R”,value={1,2,3,…}
的整数和list1
。更实用的结构可能是,根据您的需求,{RC={1,2,3,…},M={4,8,7},…}
,即key1
是原始list1
的键,list1
是值表。当满足条件1时,能否打印什么是key1
和list1
?请务必打印(“键”、键入(键1)、键入1、“列表”、键入(列表1)、列表1)。为了清晰起见,我明确说明了“键”和“值”,但似乎我增加了混淆。我试图构建的正是您在评论中描述的{RC={1,2,3,…},m={4,8,7},…}
,但没有成功。好吧,那么我怀疑您得到的答案是否有助于解决“即使满足所有条件,也不会向表中添加任何列表”,目前的状态如何?如果没有,我想你必须发布更详细的代码,显示你的结构、实际情况,并向列表中添加项目,因为你显示的内容看起来很好,所以问题在于代码没有显示。谢谢Tom,你解释得比我清楚得多。这正是我想要的,但不幸的是,我无法做到这一点。从我在Lua.org上读到的内容来看,我希望locallistoflists={}代码>和列表[“RC”]={1,2,3,4}
将生成类似于{RC={1,2,3,4}}
的内容,但操作后listOfLists表仍然是{}table.maxn(listofList)
return 0maxn
在这种情况下应该返回0,因为您没有任何类型为正整数的键。唯一的关键是