您一般如何解释有序地图?

How would you explain ordered map in general?

我目前正在尝试学习 Symfony,其中很大一部分是 Doctrine。我一直在阅读 Doctrine 的官方文档,在关于 Collections library 的部分我偶然发现了这个叫做 "ordered map" 的东西。我试图在 google 上搜索它,但没有找到任何令人满意的答案。只有特定语言的答案(主要是 Java 和 C++),但我想总体上理解它。它是如何工作的以及它是什么,因为在 Doctrine 文档中他们将它与 ArrayCollection 进行比较,所以我希望如果我能理解它是什么,那么我也更容易理解 ArrayCollection。

我尝试搜索 "what is an ordered map" 或 "ordered map explained" 之类的内容,但正如我之前所说,我没有找到我要找的内容。

当条目保持与插入时相同的顺序时,映射有时称为 有序

例如,PHP 中的数组是 有序的 (保留插入顺序)。所以 creating/modifying 这样的数组:

$array = [2 => 'a', 1 => 'b'];
$array[0] = 'c';

确实会导致 PHP 数组 [2 => 'a', 1 => 'b', 0 => 'c'] - 它保留插入顺序 - 而在其他一些语言中它会变成 [0 => 'c', 1 => 'b', 2 => 'a'].

这会影响一些操作。使用 foreach 遍历数组将 return 按插入顺序排列条目。您可以对 PHP 数组进行按键或按值排序,默认排序函数 sort 删除 原始键并按数字重新索引。使用数字键进行序列化和反序列化可能会产生意想不到的后果。以及其他一些有时有益、有时令人惊讶或恼人(或两者兼而有之)的效果。您可以在 PHP's array doc page 和数组函数页面上阅读很多内容。

在 Doctrine 的上下文中(因为它是在 PHP 中编写的)这意味着,可以按照您想要的任何方式对值是实体对象的集合进行排序(当然包括 id),并且如果您遍历该集合,您将按照学说添加的顺序(SQL/DQL 查询的顺序)获得实体对象。 Doctrine 还允许将键设置为实体的 id,同时仍然保留 SQL/DQL 查询顺序。这可以简化代码,因为 Doctrine 的 Collection 实现了 PHP 的 ArrayAccess

作为反例,地图也可以是无序的或排序的,其中第一个意味着当您检索对时顺序可以是随机的(在 golang 中,在遍历地图时起始索引过去是随机的,不要'不知道这是否仍然正确)或自动排序(如 Java 中的 SortedMap)。