2012-02-06 29 views
7

为什么(按组标识(范围150))返回结果如clojure的团队为什么不总是维持秩序?

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

它与多线程相关吗?有没有办法解决它?

...它是否打破它的合同?

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

回答

14

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

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

不,不违反合同group-by。合同只规定了地图值的元素排序,而不是地图本身的排序。

+0

“每个键的价值”部分现在看起来非常明显! ;)我也在想32,但我认为那里有足够的Q.谢谢。 – status203 2012-02-06 13:53:00