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

Dya*_*ler 2 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
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是Lua只会拿起其中一个号码而忽略其余的号码.无论重复如何,我都需要所有可能的哈希值.QuestData表("数据库")有超过10,000个条目.我不打算通过所有这些并删除重复项.此外,重复是存在的,因为可以在游戏中的多个位置拾取相同的任务.这不是一个重复的任务,但它有一个不同的哈希数.

Jak*_*uje 5

钥匙总是独一无二的.关键的一点是,键指向唯一值,并且您不能使用更多具有相同名称的键来指向不同的值.根据Lua表的定义.

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

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

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

引用Lua表


在Lua中哈希

根据评论,我更新答案,以了解散列.

您通常在像C这样的低级语言中使用散列.在Lua中,关联数组已经在某种程度上在后台进行了散列,因此它会过度(特别是使用SHA等).

您应该构建更多级别的表来处理冲突(Lua中没有"更好"的东西),而不是C中常用的链表.

如果你想让它花哨设置一些metatables,使它在某种程度上透明.但是从您的问题来看,您的数据看起来如何以及您真正想要的内容尚不清楚.

基本上你不需要更多:

QuestData = {
    ["QuestName"]={
        ["Quest Descrip"]={
            {8,1686192712},
            {32,1686193248},
            {0,2965579272},
         },
    },
}
Run Code Online (Sandbox Code Playgroud)