将带有字符串键的表值插入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

我对Lua语言还比较陌生,表结构显然有一些地方我还没有掌握

我试图创建一个表的表,表中的每个表都有一个键,值是相应的表

好吧,这句话可能会让人困惑。下面是一个例子:

{{ 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”时,它永远不会为空@memoryofream
    ipairs
    仅按数字索引元素进行。从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 0
    maxn
    在这种情况下应该返回0,因为您没有任何类型为正整数的键。唯一的关键是