在代码片段中阅读注入的注释应该提供足够的上下文。
--| Table |--
QuestData = {
["QuestName"]={
["Quest Descrip"]={8,1686192712},
["Quest Descrip"]={32,1686193248},
["Quest Descrip"]={0,2965579272},
},
}
--| Code Snippet |--
--| gets QuestName then does below |--
if QuestName then
-- (K = QuestName) and (V = the 3 entries below it in the table)
for k,v in pairs(QuestData) do
-- Checks to make sure the external function that obtained the QuestName matches what is in the table before cont
if strlower(k) == strlower(QuestName) then
local index = 0
-- Iterates over the first two pairs - Quest Descrip key and values
for kk,vv in pairs(v) do
index = index + 1
end
-- Iterates over the second two pairs of values
if index == 1 then
for kk,vv in pairs(v) do
-- Sends the 10 digit hash number to the function
Quest:Function(vv[2])
end
end
end
end
end
我遇到的问题是Lua只会拿起其中一个号码而忽略其余的号码。无论重复如何,我都需要所有可能的哈希值。 QuestData表("数据库")有超过10,000个条目。我不打算通过所有这些并删除重复项。此外,重复是存在的,因为可以在游戏中的多个位置拾取相同的任务。它不是重复的任务,但它具有不同的哈希值。
答案 0 :(得分:5)
密钥始终是唯一。它是键的 point ,键指向唯一值,并且您不能使用更多具有相同名称的键来指向不同的值。根据Lua表的定义。
就像你想要两个具有相同名称和不同内容的变量一样。这没有意义......
表类型实现关联数组。 [...]
与全局变量一样,如果未初始化表字段,则表示字段的值为nil。与全局变量一样,您可以将nil分配给表字段以将其删除。这不是巧合: Lua将普通表中的全局变量存储起来。
根据评论,我更新答案以了解散列。
你通常在像C这样的低级语言中使用散列。在Lua中,关联数组已经在后台以某种方式进行了哈希处理,因此它会过度(特别是使用SHA等)。
除了C中常用的链表之外,你应该构建更多级别的表来处理冲突(没有什么"更好"在Lua中)。
如果你想让它花哨设置一些metatables,使它以某种方式透明。但是从你的问题来看,你的数据看起来和你真正想要的内容真的不太清楚。
基本上你不需要更多:
QuestData = {
["QuestName"]={
["Quest Descrip"]={
{8,1686192712},
{32,1686193248},
{0,2965579272},
},
},
}
答案 1 :(得分:1)
正如Jakuje已经提到的,表键是唯一的。 但您可以将两者存储为表格成员,如:
QuestData = {
-- "QuestName" must be unique! Of course you can put it into a table member as well
["QuestName"]={
{hash = "Quest Descrip", values = {8,1686192712} },
{hash = "Quest Descrip", values = {32,1686193248} },
{hash = "Quest Descrip", values = {0,2965579272} }
}
}
我相信你能以更好的方式组织这个。对我来说,这看起来像是一个相当令人困惑的概念。
答案 2 :(得分:0)
你已经说过你不能“重写数据库”,但问题是QuestData
表不能保存你认为的数据库。
这是你的表:
QuestData = {
["QuestName"]={
["Quest Descrip"]={8,1686192712},
["Quest Descrip"]={32,1686193248},
["Quest Descrip"]={0,2965579272},
},
}
但是,这实际上就像写作......
QuestData["Quest Descrip"] = {8,1686192712}
QuestData["Quest Descrip"] = {32,1686193248}
QuestData["Quest Descrip"] = {0,2965579272}
所以第二个(然后是第三个)值会覆盖第一个。问题不在于您无法访问该表,而是该表不再包含这些值。
您需要找到一种表示数据的不同方式。