Clojure如何实现对Map的字符串值进行不区分大小写的排序
Clojure不区分大小写排序Map字符串值方案
要实现Map字符串值的不区分大小写排序,核心原理是将字符串统一转换为全小写或全大写后作为排序依据,规避大小写带来的排序差异,具体实现如下:
方案1:使用sort-by直接实现(推荐)
配合clojure.string的大小写转换函数,一行代码即可实现:
首先引入字符串工具库:
(require '[clojure.string :as str])
正序排序
(sort-by (comp str/lower-case second) {:1 "A" :2 "Z" :3 "i"}) ;; 输出结果:([:1 "A"] [:3 "i"] [:2 "Z"])
倒序排序
;; 写法1:指定desc参数 (sort-by (comp str/lower-case second) :desc {:1 "A" :2 "Z" :3 "i"}) ;; 输出结果:([:2 "Z"] [:3 "i"] [:1 "A"]) ;; 写法2:配合reverse函数 (reverse (sort-by (comp str/lower-case second) {:1 "A" :2 "Z" :3 "i"}))
方案2:自定义通用比较器
如果需要多次复用不区分大小写的排序逻辑,可以封装为独立比较器:
(require '[clojure.string :as str]) (defn case-insensitive-val-cmp [entry1 entry2] (compare (str/lower-case (second entry1)) (str/lower-case (second entry2))))
正序排序
(sort case-insensitive-val-cmp {:1 "A" :2 "Z" :3 "i"}) ;; 输出:([:1 "A"] [:3 "i"] [:2 "Z"])
倒序排序
(sort (comp - case-insensitive-val-cmp) {:1 "A" :2 "Z" :3 "i"}) ;; 输出:([:2 "Z"] [:3 "i"] [:1 "A"])
注意事项
- 上述两种方案同时兼容Clojure JVM环境和ClojureScript运行环境
- 如果Map的值可能存在非字符串类型,可在转大小写前增加类型判断逻辑,避免执行报错
- 涉及多语言本地化排序场景时,JVM环境可替换为
java.text.Collator实现更适配对应语言的排序规则
内容的提问来源于stack exchange,提问作者Navneet Singh
相关产品推荐
相关产品推荐

