如果我在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
keys
和vals
的文档如下:
- 返回映射键的序列,其顺序与 (seq 映射) 相同。
- 返回映射值的序列,其顺序与 (seq map) 相同
因此,无论是否对地图进行排序,调用(keys m)
和(vals m)
的结果都将是 1 比 1 对应的。 由于排序映射是按键排序的,因此(keys srt-map)
的结果将被排序。