Here are some functions used for working with collections (vectors, maps, sets). I did not include too much with lists, since I think a lot of Clojure people prefer vectors.
user=> (def letter-vec (vector "a", "b", "c", "d"))
#'user/letter-vec
;; use nth function to get elements, 0-based
user=> (nth letter-vec 0)
"a"
user=> (nth letter-vec 1)
"b"
user=> (nth letter-vec 2)
"c"
user=> (nth letter-vec 3)
"d"
user=> (nth letter-vec 4)
IndexOutOfBoundsException clojure.lang.PersistentVector.arrayFor (PersistentVector.java:158)
user=>
;; cycle through vector
user=> (for [x letter-vec] (println "Next element: ", x))
Next element: a
Next element: b
Next element: c
Next element: d
(nil nil nil nil)
;; doseq kind of does the same thing
user=> (doseq [x letter-vec] (println "Next element: ", x))
Next element: a
Next element: b
Next element: c
Next element: d
nil
user=> (def my-map {:fname "George" :lname "Washington" :residence "Mt Vernon" :teeth "Not wood"})
#'user/my-map
user=> (keys my-map)
(:fname :lname :residence :teeth)
user=> (vals my-map)
("George" "Washington" "Mt Vernon" "Not wood")
user=> (doseq [k (keys my-map) ]
(println "Key: ", k, ", Value: " , (get my-map k)))
Key: :fname , Value: George
Key: :lname , Value: Washington
Key: :residence , Value: Mt Vernon
Key: :teeth , Value: Not wood
nil
user=> (for [k (keys my-map) ]
(println "Key: ", k, ", Value: " , (get my-map k)))
Key: :fname , Value: George
Key: :lname , Value: Washington
Key: :residence , Value: Mt Vernon
Key: :teeth , Value: Not wood
(nil nil nil nil)
user=> (def s-map (sorted-map :a "AA" :b "BB" :c 44))
#'user/s-map
user=> s-map
{:a "AA", :b "BB", :c 44}
;; sorted-map looks at keys, not values
user=> (def s-map2 (sorted-map :a "AA" :b "BB" "c" 44))
ClassCastException clojure.lang.Keyword cannot be cast to java.base/java.lang.String java.lang.String.compareTo (String.java:123)
;; sorted set items must all be of same type
user=> (def a-set (sorted-set "kurt vonnegut" 20 :icicle))
ClassCastException java.base/java.lang.String cannot be cast to java.base/java.lang.Number clojure.lang.Util.compare (Util.java:152)
user=> (def a-set (hash-set "kurt vonnegut" 20 :icicle))
#'user/a-set
user=> (class a-set)
clojure.lang.PersistentHashSet
user=> (def b-set #{"kurt vonnegut" 20 :icicle})
#'user/b-set
;; hash sets are the default
user=> (class b-set)
clojure.lang.PersistentHashSet
;; doseq works on sets too
user=> (doseq [x b-set] (println "Next element: ", x))
Next element: 20
Next element: :icicle
Next element: kurt vonnegut
;; so does "for"
user=> (for [x b-set] (println "Next element: ", x))
Next element: 20
Next element: :icicle
Next element: kurt vonnegut
(nil nil nil)
user=> (def num-set #{1 3 5 7 9})
#'user/num-set
user=> num-set
#{7 1 3 9 5}
user=> (conj num-set 4)
#{7 1 4 3 9 5}
user=> (conj num-set 4)
#{7 1 4 3 9 5}
user=> (conj num-set 8)
#{7 1 3 9 5 8}
user=> (def sorted-num-set (sorted-set 9 3 7 1 5))
#'user/sorted-num-set
user=> sorted-num-set
#{1 3 5 7 9}
user=> (conj sort
sort sort-by sorted-map sorted-map-by sorted-num-set sorted-set sorted-set-by sorted?
user=> (conj sorted
sorted-map sorted-map-by sorted-num-set sorted-set sorted-set-by sorted?
user=> (conj sorted-num-set 4)
#{1 3 4 5 7 9}
user=> (contains? sorted-num-set 3)
true
user=> (contains? sorted-num-set 'a')
ClassCastException java.base/java.lang.Long cannot be cast to clojure.lang.Symbol clojure.lang.Symbol.compareTo (Symbol.java:105)
;; Wouldn't "false" be a better response? Perhaps it's macro time!!
user=> (contains? sorted-num-set :a)
ClassCastException java.base/java.lang.Long cannot be cast to clojure.lang.Keyword clojure.lang.Keyword.compareTo (Keyword.java:114)
user=> (contains? a-set :a)
false
user=> (keyword? :a)
true
user=> (def keyword-set (sorted-set :a :d :c :b ))
#'user/keyword-set
user=> (contains? keyword-set :s)
false
user=> (contains? keyword-set :d)
true
user=> (contains? keyword-set 3)
ClassCastException clojure.lang.Keyword cannot be cast to java.base/java.lang.Number clojure.lang.Util.compare (Util.java:152)
user=> keyword-set
#{:a :b :c :d}
user=> (:a keyword-set)
:a
user=> (:k keyword-set)
nil
user=> (get #{:a :b} "kurt vonnegut")
nil
You’re welcome.