2011-04-14 6 views
4

이 코드 스 니펫이 원본 벡터를 생성하지만 대/소문자를 구분하지 않고 정렬 할 것으로 예상했습니다. 대신 원본 벡터를 변경하지 않습니다. 내 비교 기능이 작동하지 않는 이유는 무엇입니까? 술어 (true 또는 false를 반환하는 함수)을 투여했을 때간단한 비교기가 (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

comparatorjava.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을 얻지 못하는 것 같습니다. –

+0

Erm, 너무 빨리 말하면서 (비교 자) ** 실제로 ** 평등을 처리합니다. –

1

비교되어 있지 술어를, 그것은 비교입니다.

관련 문제