Lua 5.0 - 迭代表时忽略重复键,即使值不同

阅读代码片段中的注入注释应该足够了解上下文。

   --| 表 |--
    QuestData = {
        ["任务名称"]={
            ["任务描述"]={8,1686192712},
            ["任务描述"]={32,1686193248},
            ["任务描述"]={0,2965579272},
        },
    }

--| 代码片段 |--
--| 获取任务名称然后执行以下内容 |--

    if QuestName then
        -- (K = 任务名称) 及 (V = 表中它以下的 3 个条目)
        for k,v in pairs(QuestData) do
            -- 在继续之前检查确保获得任务名称的外部函数与表中的匹配
            if strlower(k) == strlower(QuestName) then
                local index = 0
                -- 迭代前两对 - 任务描述键和值
                for kk,vv in pairs(v) do
                    index = index + 1
                end
                -- 迭代第二个两个值
                if index == 1 then
                    for kk,vv in pairs(v) do
                        -- 将这个十位数哈希数发送到函数
                        Quest:Function(vv[2])
                    end
                end
            end
        end
    end

我遇到的问题是 Lua 只会获取一个数字并忽略其余的数字。我需要所有可能的哈希数字,而不管重复。QuestData 表(“数据库”)有超过 10,000 条目。我不会去检查并删除其中的重复项。此外,这些重复项是因为在游戏中可以在多个位置上拾取同一个任务。这不是重复任务,但它有不同的哈希数。

点赞
用户2196426
用户2196426

Key始终是唯一的。这是键的要点,即键指向唯一的值,你不能有相同名称的不同键来指向不同的值。这是Lua表的定义。

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

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

像全局变量一样,如果表字段没有初始化,则计算出nil。像全局变量一样,您可以将nil分配给表字段以删除它。这不是巧合: Lua将全局变量存储在普通的表中。

引用自Lua Tables


在Lua中的哈希

根据评论,我更新了答案,以提供关于哈希的一些想法。

在诸如C之类的低级语言中,通常使用哈希。在Lua中,关联数组在背景中已经以某种方式被哈希,因此这将是过度(尤其是使用SHA或类似的东西)。

与C通常使用的链接列表不同,您应该构建更多级别的表来处理冲突(在Lua中没有“更好”的方法)。

如果你想要将其设置得复杂一些,请设置一些元表,使其在某种程度上变得透明。但从您的问题中,真的不清楚您的数据长什么样,您真正想要什么。

基本上,你不需要更多的东西:

QuestData = {
    ["QuestName"]={
        ["Quest Descrip"]={
            {8,1686192712},
            {32,1686193248},
            {0,2965579272},
         },
    },
}
2016-03-30 07:49:07
用户2858170
用户2858170

正如 Jakuje 已经提到的,表的键必须是唯一的。 但是你也可以把它们存储为表的成员,比如:

   QuestData = {
    -- “QuestName”必须是唯一的!当然你也可以把它放到一个表成员里
    ["QuestName"]={
       {hash = “任务描述”, values = {8,1686192712} },
       {hash = “任务描述”, values = {32,1686193248} },
       {hash = “任务描述”, values = {0,2965579272} }

        }
    }

我相信你可以用更好的方法来组织它。对我来说,这似乎是一个相当令人困惑的概念。

2016-03-30 08:20:42
用户1737
用户1737

你曾表示你不能"重写数据库",但问题在于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}

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

你需要找到另一种表示数据的方法。

2016-03-30 21:27:51