Vlákno názorů k článku Čtyři různé podoby datové struktury map v programovacím jazyku Clojure od jumar - Diky za zaujimavy a obsiahly clanok! Par komentov: V sekcii...

  • Článek je starý, nové názory již nelze přidávat.
  • 20. 4. 2021 5:51

    jumar

    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.Per­sistentArrayMap
    ;;;
    (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.Per­sistentHashMap

    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

  • 20. 4. 2021 12:37

    Pavel Tišnovský
    Zlatý podporovatel

    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á.