group-by似乎改变了范围的顺序

时间:2014-03-30 14:40:03

标签: algorithm clojure range

我试图在distinct上为问题#56重写4clojure.org,我有一个有效的解决方案,但我和其他人一起玩。

我很困惑为什么我最近的尝试在最后一次单元测试中失败了:

;; unit tests:
;; (= (__ [1 2 1 3 1 2 4]) [1 2 3 4])
;; (= (__ [:a :a :b :b :c :c]) [:a :b :c])
;; (= (__ '([2 4] [1 2] [1 3] [1 3])) '([2 4] [1 2] [1 3]))
;; (= (__ (range 50)) (range 50))

;; most recent attempt
(fn [xs] (keys (group-by identity xs))) ;; fails for (range 50)

;; what?!?!
(keys (group-by identity (range 50))) ;; => (0 32 1 33 2 34 3 35 4 36 5 37 6 38 7 39 8 40 9 41 10 42 11 43 12 44 13 45 14 46 15 47 16 48 17 49 18 19 20 21 22 23 24 25 26 27 28 29 30 31)

我之所以得到这个看似随机的顺序是什么原因?

PS:此处是问题的链接,但我不确定您是否可以在没有帐户的情况下看到该问题http://www.4clojure.com/problem/56

1 个答案:

答案 0 :(得分:2)

group-by返回输入的哈希映射,其中传入的函数返回足够多的不同值。 1 哈希映射在遍历期间不对关键顺序做出任何保证。


1 group-by开始创建瞬态数组映射,然后使用assoc!添加新密钥。当数组映射增长超过一定大小时(Clojure 1.6.0中的8个条目),它们会自动转换为哈希映射。 (为完整起见,可以使用clojure.core/array-map创建更大的数组映射。)