为什么(group-by identity(范围150))返回结果
{32 [32],1 [1],33 [33],2 [2],34 [34],3 [3],35 [35] ......
它是多线程相关的吗?它有什么办法吗?
......它是否违反了合同?
返回由每个元素上的f的结果键入的coll元素的映射.每个键的值将是它们在coll中出现的顺序的相应元素的向量.
Dan*_*nus 14
尝试输入(type (group-by identity (range 1 50)))您的REPL.您可以看到结果实际上是一个哈希映射(类clojure.lang.PersistentHashMap).这意味着它是无序的:原则上,REPL可以按键/值对的任何顺序输出打印的映射文字.
为什么它打印它的打印方式的实际原因有做Clojure的实现哈希映射-在数据结构方面,它实际上是一个广泛的树,其中每个节点最多可以有32名儿童(因此初始32的输出回想一下,Clojure向量和地图经常被引用为O(log32N)的查找成本.这篇博客文章有一个很好的总结.
不,它没有违反合同group-by.合约仅指定地图的值元素的排序,而不是地图本身的排序.