0
votes

I'm trying to sort a map by values (case insensitive). But it seems clojure sort function is case sensitive. See below example ,

cljs.user=> (sort {:1 "A" :2 "Z" :3 "i"})
([:1 "A"] [:2 "Z"] [:3 "i"])

cljs.user=> (reverse (sort {:1 "A" :2 "Z" :3 "i"}))
([:3 "i"] [:2 "Z"] [:1 "A"])

Can anyone please suggest me a solutions for this how can I sort in clojure by case-insensitive ?

3
Please note that javascript has almost nothing to do with java and nothing to do with clojure. - T.J. Crowder
@T.J.Crowder I've seen some neat projects done in ClojureScript... - chrylis -cautiouslyoptimistic-
@chrylis-cautiouslyoptimistic- - Heh. And yet. :-) - T.J. Crowder

3 Answers

6
votes

Java provides a case insensitive string comparator:

(def m {:1 "A" :2 "Z" :3 "i"})
(sort-by val String/CASE_INSENSITIVE_ORDER m) ;; => ([:1 "A"] [:3 "i"] [:2 "Z"])
3
votes

this one would probably work:

user> (sort-by (comp clojure.string/lower-case val) {:1 "A" :2 "Z" :3 "i"})
;;=> ([:1 "A"] [:3 "i"] [:2 "Z"])

or for :rank from op's answer:

user> (sort-by (comp clojure.string/lower-case :rank) [{:rank "A"} {:rank "Z"} {:rank "i"}])
;;=> ({:rank "A"} {:rank "i"} {:rank "Z"})
0
votes

The answer for this problem is

 cljs.user=> (sort-by :rank #(> (clojure.string/upper-case %1) (clojure.string/capitalize %2))  [{:rank "A"} {:rank "Z"} {:rank "i"}]) 
({:rank "Z"} {:rank "i"} {:rank "A"})

Here we are comparing the values one by one after converting them to upper-case.