使用字符串键将表值插入Lua表

时间:2014-03-23 22:38:23

标签: 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 condition1 then
   listOfLists[key1] = list1;
end
...
if condition2 then
   listOfLists[key2] = list2;
end
...

等等......

我希望稍后使用这些键来确定哪些列表已添加到表中。 但问题是,即使满足所有条件,似乎也没有列表添加到列表中。

我可以使用table.insert(listOfLists, list1)代替listOfLists[key1] = list1,但后来我无法确定哪些列表已添加到集合中。 蚂蚁建议?

2 个答案:

答案 0 :(得分:3)

很难理解,你想达到什么目标。因此,如果您想要更具体的答案,请提供更多信息。

您可以创建表的关联表。

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

您可以使用代码中的table constructor或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迭代器)保证仅适用于表的向量部分。但它们明显更快。

编辑:(最后一段解释)

如果你有一个带有一些键的表并希望迭代,你可以使用ipairs或pair。

ipairs是有序的,从1到第一个非零元素。它不会迭代非整数键。 pairs通过任何密钥,但不保证顺序。

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

  

返回给定表的最大正数字索引,如果表没有正数字索引则返回零。 (为了完成它的工作,这个函数对整个表进行线性遍历。)

关于长度和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.

答案 1 :(得分:2)

Lua表是一种灵活的数据结构。元素是键值对。密钥是除nil之外的任何Lua值。除nil之外,值可以包含任何值。为值分配nil将删除该对。

具有number类型的键值的表的(可能为空)子集是从1到n的整数,称为序列。 n被确定为与nil值配对的最后一个这样的密钥。几个表函数和运算符仅适用于序列。

表构造函数允许键的几种语法:

  1. 通过序列隐含:{1, 2, 3}
  2. 明确键:{[1] = 1, [3] = 3, ["two"] = "value"}
  3. 标识符键:{one = 1, two = 2}
  4. 表构造函数可以使用它们的任意组合。

    您已经定义了一系列元素,每个元素都是一个包含两个元素的表格 第二个是序列。

    看起来你希望键是字符串,值是序列:

    { 
      RC = {1, 2, 3, 4},
      M = {4, 8, 7},
      D = {3, 8, 9}
    }