为什么clojure的小组并不总是保持秩序?

时间:2012-02-06 13:27:48

标签: clojure group-by

为什么(group-by identity(范围1 50))返回结果

{32 [32],1 [1],33 [33],2 [2],34 [34],3 [3],35 [35] ......

是否涉及多线程?有什么方法吗?

......它是否违反了合同?

  

返回每个元素上由f的结果键入的coll元素的映射。每个键的值将是相应元素的向量,按照它们出现在coll中的顺序

1 个答案:

答案 0 :(得分:14)

尝试在REPL中输入(type (group-by identity (range 1 50)))。您可以看到结果实际上是一个哈希映射(类clojure.lang.PersistentHashMap)。这意味着它是无序的:原则上,REPL可以按键/值对的任何顺序输出打印的地图文字。

以打印方式打印的实际原因与Clojure的哈希映射实现有关 - 就数据结构而言,它实际上是一个宽树,每个节点最多可以有32个子节点(因此最初为32个)在你的输出中;回想一下,Clojure向量和映射经常被引用为具有O(log32N)的查找成本。 This blog article有一个很好的总结。

不,它没有违反group-by的合同。合约只指定地图的值元素的排序,而不是地图本身的排序