2014-03-30 66 views
1

我想在4clojure.org上爲#56問題重寫distinct,並且我有一個工作解決方案,但我正在與其他人一起玩。group-by by seewisely changes order of range

我很困惑,爲什麼我最近一次嘗試是失敗的最後一個單元測試:

;; 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

回答

2

group-by返回其中函數在返回足夠多的不同的值通過輸入一個哈希表。 散列貼圖在遍歷期間不對關鍵順序做任何保證。


group-by開始了創建瞬時陣圖,然後使用assoc!增加了新的密鑰。當數組長度超過一定大小(Clojure 1.6.0的8個條目)時,數組映射會自動轉換爲哈希映射。 (爲了完整性,可以使用clojure.core/array-map創建更大的陣列圖。)