2014-03-30 2 views
1

4clojure.org에 문제 # 56에 대해 distinct을 다시 쓰려고하는데 현재 해결책이 있지만 다른 사람들과 놀고 있습니다.group-by는 겉으로보기에 범위의 순서를 변경합니다.

내 가장 최근의 시도가 마지막으로 단위 테스트 실패 이유를 혼란 스러워요 :

;; 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 함수가 반환 충분히 많은 고유 값 전달 입력에 대한 해시 맵을 반환하지 않고 그것을 볼 수 있는지 확실하지 않습니다. 해시 맵은 순회 중 키 순서를 보장하지 않습니다.


1group-by는 과도 배열 맵을 작성 시작은 다음 assoc!를 사용하여 새로운 키를 추가한다. 배열 맵은 특정 크기 (Clojure 1.6.0에서 8 개 항목) 이상으로 커질 때 자동으로 해시 맵으로 변환됩니다. (완전성을 위해 clojure.core/array-map을 사용하여 더 큰 배열 맵을 만들 수 있습니다.)

관련 문제