Clojure 简单比较器未按(I)预期排序
我希望这个代码片段能够生成原始向量,但排序方式不区分大小写。取而代之的是,我得到了原始向量。为什么我的比较器不工作Clojure 简单比较器未按(I)预期排序,clojure,Clojure,我希望这个代码片段能够生成原始向量,但排序方式不区分大小写。取而代之的是,我得到了原始向量。为什么我的比较器不工作 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"])
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")
comparator
在给定谓词时返回java.util.comparator
(返回true或false的函数)。如果显式使用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 str/upper-case ["B" "a" "c" "F" "r" "E"])
;=> ("a" "B" "c" "E" "F" "r")
compare不是一个谓词,它是一个比较器。谢谢,我想我被比较器产生3个可能的值(-1,0,1)而谓词只能产生true或false这一事实弄糊涂了。所以,似乎你永远不会从使用(比较器)生成的东西中得到0。呃,说得太早了,(比较器)实际上也处理相等。