问题描述
|
我希望该代码段能够生成原始矢量,但是以不区分大小写的方式进行排序。相反,我得到了原始矢量。为什么我的比较器不起作用?
user=> (ns user (require [clojure.contrib.string :as str]))
nil
user=> (sort
(comparator #(compare (str/upper-case %1) (str/upper-case %2)))
[\"B\" \"a\" \"c\" \"F\" \"r\" \"E\"])
(\"B\" \"a\" \"c\" \"F\" \"r\" \"E\")
解决方法
给定谓词(返回真假的函数)时,1a将返回
java.util.Comparator
。如果您明确使用compare
,则不需要它。所以就:
(sort #(compare (str/upper-case %1) (str/upper-case %2))
[\"B\" \"a\" \"c\" \"F\" \"r\" \"E\"])
;=> (\"a\" \"B\" \"c\" \"E\" \"F\" \"r\")
或者,使用sort-by
:
(sort-by str/upper-case [\"B\" \"a\" \"c\" \"F\" \"r\" \"E\"])
;=> (\"a\" \"B\" \"c\" \"E\" \"F\" \"r\")
,比较不是谓词,而是比较器。