如果我在排序映射上调用键,生成的 seq 是否保证按排序顺序排列?



如果我在sorted-map类型上调用keys,我会假设生成的seq与映射中的键值对的顺序相同。

然而,一位来自ClojureDocs的用户Jarzka在大约2年前这样说:

我注意到密钥并不总是以相同的顺序返回。通常是这样,但并非总是如此。

(不幸的是,我无法直接链接到评论。 它位于描述keys的页面底部。

为什么会这样? 为了安全起见,我应该(sort (keys m))吗?

(def m (sorted-map :a 1, :b 2, :c 3))
(def maybe-unsorted-keys? (keys m))
(def sorted-keys (sort (keys m))) 

如果您查看键和 vals 的实现,看起来它们将以相同的顺序返回

,排序:https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentTreeMap.java#L888

keysvals的文档如下:

  • 返回映射键的序列,其顺序与 (seq 映射) 相同。
  • 返回映射值的序列,其顺序与 (seq map) 相同

因此,无论是否对地图进行排序,调用(keys m)(vals m)的结果都将是 1 比 1 对应的。 由于排序映射是按键排序的,因此(keys srt-map)的结果将被排序。

最新更新