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

If I call keys on a sorted-map, is the resulting seq guaranteed to be in sorted order?

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

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

I noticed that the keys are not always returned in the same order. Usually they are, but not always.

(不幸的是我不能直接link评论。它在描述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))) 

如果您查看 keys 和 vals 的实现,似乎可以有效假设它们将以相同的顺序返回,已排序:

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

文档for keys and for vals内容如下:

  • Returns 地图键的序列,与 (seq map) 的顺序相同。
  • Returns 地图值的序列,与 (seq map)
  • 的顺序相同

因此无论地图是否排序,调用(keys m)(vals m)的结果将一一对应。由于 sorted-map 是按键排序的,因此 (keys srt-map) 的结果将被排序。