为什么(group-by identity(范围1 50))返回结果
{32 [32],1 [1],33 [33],2 [2],34 [34],3 [3],35 [35] ......
是否涉及多线程?有什么方法吗?
......它是否违反了合同?
返回每个元素上由f的结果键入的coll元素的映射。每个键的值将是相应元素的向量,按照它们出现在coll中的顺序。
答案 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
的合同。合约只指定地图的值元素的排序,而不是地图本身的排序。