Lua 5.0 - 即使值不同,对表的迭代也会忽略重复键

时间:2016-03-30 07:06:55

标签: lua

在代码片段中阅读注入的注释应该提供足够的上下文。

   --| 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个条目。我不打算通过所有这些并删除重复项。此外,重复是存在的,因为可以在游戏中的多个位置拾取相同的任务。它不是重复的任务,但它具有不同的哈希值。

3 个答案:

答案 0 :(得分:5)

密钥始终是唯一。它是键的 point ,键指向唯一值,并且您不能使用更多具有相同名称的键来指向不同的值。根据Lua表的定义。

就像你想要两个具有相同名称和不同内容的变量一样。这没有意义......

  

表类型实现关联数组。 [...]

     

与全局变量一样,如果未初始化表字段,则表示字段的值为nil。与全局变量一样,您可以将nil分配给表字段以将其删除。这不是巧合: Lua将普通表中的全局变量存储起来。

来自Lua Tables

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

所以第二个(然后是第三个)值会覆盖第一个。问题不在于您无法访问该表,而是该表不再包含这些值。

您需要找到一种表示数据的不同方式。