简单比较器未按I预期排序

问题描述

| 我希望该代码段能够生成原始矢量,但是以不区分大小写的方式进行排序。相反,我得到了原始矢量。为什么我的比较器不起作用?
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\")
    ,比较不是谓词,而是比较器。