Diky za zaujimavy a obsiahly clanok!
Par komentov:
V sekcii 10 je ukazka hash-map ktora pouziva nespravny vypis poradia hodnot v mape - to co je ukazane zodpoveda skor pouzitiu array-map, nie hash-map.
hash-map vypise kluce v poradi konzistentnom so seq, keys, a vals.
(def p1 (hash-map :a 2 :b 1 :c 3 :d 5 :e 4 :f 3 :g 0 :h 10 :i 6 :j 7))
p1
;;=> {:e 4, :g 0, :c 3, :j 7, :h 10, :b 1, :d 5, :f 3, :i 6, :a 2}
Mozno by bolo tiez dobre spomenut ze mapovy literal {} vytvara automaticka instanciu "array map" pre pocet prvkov <= 8 a "hash map" pre viacero prvkov:
(def p1a { :a 2 :b 1 :c 3 :d 5 :e 4 :f 3 :g 0 :h 10 })
p1a
;;=> {:a 2, :b 1, :c 3, :d 5, :e 4, :f 3, :g 0, :h 10}
;;;
(def p1 { :a 2 :b 1 :c 3 :d 5 :e 4 :f 3 :g 0 :h 10 :i 6})
p1
;;=> {:e 4, :g 0, :c 3, :h 10, :b 1, :d 5, :f 3, :i 6, :a 2}
Tiez je dobre podotknut ze operacia assoc "potichu" zmeni type mapy ak pocet prvkov prekroci 8:
(def p1a { :a 2 :b 1 :c 3 :d 5 :e 4 :f 3 :g 0 :h 10 })
(type p1a)
;;=> clojure.lang.PersistentArrayMap
;;;
(assoc p1a :i 6)
;;=> {:e 4, :g 0, :c 3, :h 10, :b 1, :d 5, :f 3, :i 6, :a 2}
(type (assoc p1a :i 6))
;;=> clojure.lang.PersistentHashMap
A este posledna vec:
> Pokud se do mapy ukládají i hodnoty nil, nezbývá většinou nic jiného, než kombinace get+contains?:
Pre tieto pripady je uzitocny idiom vyuzivajuci if-let a find:
(if-let [[k v] (find {:a 1 :b nil} :b)] :found :not-found)
;;=> :found
(if-let [[k v] (find {:a 1 :b nil} :c)] :found :not-found)
;;=> :not-found
Díky za doplnění. Ta info o tom, že pro malé mapy se používá PersistentArrayMap jsem chtěl uvést, ale je zajímavé, že různé verze Clojure se v tomto ohledu chovají jinak - popravdě jsem se nedíval do zdrojáků, ale ten threshold se posunul v 1.10. Nicméně v základě je to přesně tak, jak píšete - pro malé mapy se hash nedělá.