【问题标题】:Clojure sort String values - case insensitiveClojure 排序字符串值 - 不区分大小写
【发布时间】:2021-10-19 22:59:22
【问题描述】:

我正在尝试按值对地图进行排序(不区分大小写)。但似乎 clojure 排序功能是区分大小写的。 见下面的例子,

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"])

谁能给我建议一个解决方案,我如何按不区分大小写的方式在 clojure 中排序?

【问题讨论】:

  • 请注意javascriptjava 几乎无关,而clojure 无关
  • @T.J.Crowder 我见过一些用 ClojureScript 完成的巧妙项目...
  • @chrylis-cautiouslyoptimistic--呵呵。但是。 :-)

标签: functional-programming clojure clojurescript


【解决方案1】:

这个问题的答案是

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

这里我们将值转换为大写后一一进行比较。

【讨论】:

  • 混合upper-casecapitalize 似乎很受诅咒。
  • @amalloy 更新了解决方案。没有意识到我写错了。因为它应该在转换为大写后进行比较。谢谢
【解决方案2】:

Java 提供了一个不区分大小写的字符串比较器:

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

【讨论】:

  • 这个不错,但我很确定 op 正在使用 clojuresctipt,所以它不起作用。
【解决方案3】:

这个可能会起作用:

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

或来自 op 的回答中的 :rank

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2022-11-22
    • 2016-07-07
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多