繁体   English   中英

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

[英]Why does clojure's group-by not always maintain order?

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

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

它是多线程相关的吗? 它有什么办法吗?

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM