你说的这个顺序应该是恰好和哈希表的实现吻合上了
这个顺序是hashmap的实现导致的,我想恰好是32个bucket根据key取模,你看32,64所在的位置
貌似(vec (range 65))那个版本出来的依然是hashmap
要去了解一下实现才知道了
On Wed 16 May 2012 04:14:28 PM CST, Ruiyun Wen wrote:
> 一开始我也想可能是map排序的问题。于是我做了下面的实验
> (keys (group-by identity (range 32)))
> 结果是正常的,只有(range 33)及以上,才会出现问题。而32就是range的缓存
> 大小。
> 另外,谢谢Sun Ning的提示,于是我稍稍改动了一下进行测试,
> (keys (group-by identity (vec (range 50)))),
> 但结果与没有加vec相同。照理说,array-map就不会对元素顺序进行任何变动了。
> 所以我总觉得问题的根源应该更靠近range,而不是map。
>
> 另外,从大于32的结果上看。似乎有点像map函数传入2个集合参数时的那种交错
> 方式,不知道有否关联。
>
> 在 2012年5月16日 下午3:52,Sun Ning <
class...@gmail.com
> <mailto:
class...@gmail.com>>写道:
>
> group-by 得到的是一个map,这个顺序本身就不好说吧。。。
> 倒是有一个特殊的情况,似乎group-__by会根据collection的类型返回不同
> 的集合类型
> user=> (class (group-by identity (range 50)))
> clojure.lang.PersistentHashMap
> user=> (class (group-by identity [1 2 3 4 5]))
> clojure.lang.__PersistentArrayMap
>
>
> On Wed 16 May 2012 03:41:10 PM CST, Ruiyun Wen wrote:
>
> 在做4clojure #56的时候,遇到一个奇怪的问题
>
> (keys (group-by identity (range 50))) 的结果竟然是(0 32 1 33 2
> 34 ...)!
> 初步分析应该是由于range函数用了一个容量为32的缓存,__导致惰性
> 求值时顺序
> 错误。但以往出现类似问题,多是由于多线程访问,__例如Oracle的序
> 列。而本例
> 中,应该没有引起并行求值的可能。
>
> 同时,我发现用(map identity (range 50))得到的结果就是正常顺
> 序,我想也
> 能初步证明应该不是由于惰性求值过程引起的问题。
>
> PS:4clojure 的#56后来用reduce解决了,__但希望能弄清上述问题的
> 本质原因。
>
>
>
>