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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果我在排序映射上调用键,结果seq是否保证按排序顺序排列?相关的知识,希望对你有一定的参考价值。

如果我在keys类型上调用sorted-map,我会假设生成的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))) 
答案

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

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

另一答案

文档for keysfor vals内容如下:

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

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

以上是关于如果我在排序映射上调用键,结果seq是否保证按排序顺序排列?的主要内容,如果未能解决你的问题,请参考以下文章

算法的稳定性的理解

如何按值对 STL 映射进行排序?

调用排序映射后阵列上

memory_order_seq_cst如何与非原子操作同步?

在plsql中映射元素然后排序

稳定排序和不稳定排序