sorted-map

added
1.0

ns
clojure.core

type
function

(sorted-map & keyvals)

keyval => key val
Returns a new sorted map with supplied mappings.  If any keys are
equal, they are handled as if by repeated uses of assoc.

                (sorted-map :z 1, :b 2, :a 3)   ;;=> {:a 3, :b 2, :z 1}
(into (sorted-map) {:b 2 :a 1}) ;;=> {:a 1, :b 2}
            
                ; 'seq' can be used to turn a map into a list of vectors
; notice how the list is built in the sorted order as with vectors.
(seq (into (sorted-map) {:key1 "value1" :key2 "value2"}))
;;=> ([:key1 "value1"] [:key2 "value2"])
            
                ; sorting on integer keys
; also notice how each pair becomes a `MapEntry` ('key' 'val')
(into (sorted-map) [[23 :x][17 :y]])
;;=> {17 :y, 23 :x}
            
                ;; clojure doesn't have a `sorted-map?` function to distinguish a sorted-map
;; from a regular map. use `instance?`:
(def unremarkable-map {:k1 "v1" :k2 "v2"})
(def very-remarkable-map (into (sorted-map) unremarkable-map))
(instance? clojure.lang.PersistentTreeMap unremarkable-map)
;;=> false
(instance? clojure.lang.PersistentTreeMap very-remarkable-map)
;;=> true

;; This works because:
(type unremarkable-map)
;;=> clojure.lang.PersistentArrayMap (PersistentHashMap if many key-val-pairs)
(type very-remarkable-map)
;;=> clojure.lang.PersistentTreeMap

;; Clojure does have a `sorted?` predicate so you could define `sorted-map?`
(def sorted-map? (every-pred map? sorted?))