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

时间:2017-12-25 09:26:44

标签: sorting dictionary clojure sortedmap

如果我要在keys类型上拨打sorted-map,我会假设结果seq与地图中的键值对的顺序相同。

然而,名为Jarzka的ClojureDocs用户在大约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))) 

2 个答案:

答案 0 :(得分:2)

如果你看一下key和val的实现,它看起来是一个有效的假设,它们将以相同的顺序返回,排序:

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

答案 1 :(得分:1)

文档for keysfor vals内容如下:

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

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