数组和字典索引的区别是什么?

我理解,数组是一个简单的数值表,例如 local t = {"a","b","c"},而字典是一张对象表,例如 local t = {a = 1, b = 2, c = 3}。如果我在其中一种或两种情况下有误,请告诉我。

无论如何,我的问题在于我们如何索引这些条目。例如,假设我有以下代码:

local t = {"TestEntry"}
print(t["TestEntry"])

当然,这会打印 nil。然而,当我们以同样的方式使用字典时:

local t = {TestEntry = 1}
print(t["TestEntry"])

这自然地打印出 1。我的问题是,为什么对于字典来说,它是这样工作的,而对于数组来说却不是呢?

最后,我想解决导致我提出这个问题的问题。假设,在运行代码块之前,我需要查看特定的值是否在表格中。如果我可以只检查它是否在表格中,那就很方便了,例如:table["GivenEntry"],但是,正如我们所看到的,这只有在表中的条目实际上是一个对象时才起作用。在我具体的情况下,我只是使用一个数组,所以它不是一个对象。

因此,我不得不使用一个 for 循环来检查表格:

local t = {"TestEntry1","TestEntry2"}

for i,v in pairs(t) do
    if v == "TestEntry1" then
        --do code
    end
end

做过这件事之后,似乎创造一个愚蠢的字典更容易一些,例如:

local t = {TestEntry1 = "TestEntry1"}

因为这样,我可以简单地运行 t["TestEntry1"],而不必担心有一个空表(因为那么 for 循环就不会运行了)。在这种情况下创建字典有什么影响吗?一般来说,效率是否较低?

感谢您的建议。

点赞
用户5798435
用户5798435

在 Lua 中,数组和字典都是相同类型的表(table)。local t = {"TestEntry"} 本质上等同于 local t = {[1] = "TestEntry"}(Lua 需要数字用方括号表示,你可以通过 t[1] 访问它)。

因此,检查 "TestEntry1" 是否在表中的选项就像你所写的那样。字典需要更多的内存,并且根据你有多少值可能需要一些时间来创建,但访问键应该是恒定时间的。而遍历表会花费越来越长的时间,具体取决于你有多少项,所以这是一个需要权衡的抉择。

然而,有更快的方法来搜索数组(例如,如果它排序了:https://en.wikipedia.org/wiki/Binary_search_algorithm)。

2020-10-27 20:33:50