2011-04-14 57 views
4

我期望這段代碼產生原始向量,但以不區分大小寫的方式排序。相反,我得到原始矢量不變。爲什麼我的比較器不工作?簡單的比較器不排序爲(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") 

回答

14

comparator給出的謂詞(它返回真或假的函數)時返回一個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") 
+0

謝謝,我想我被比較器產生3個可能的值(-1,0,1)並且謂詞可以產生正確或錯誤的事實所困惑。所以看起來你從未使用過(比較器)得到的東西0。 – 2011-04-14 15:57:58

+0

Erm,發言太快,(比較)**確實**實際上處理平等。 – 2011-04-14 15:59:40

1

比較是不是一個謂語,這是一個比較。