Простой компаратор не сортирует, как ожидалось (I) - PullRequest
5 голосов
/ 14 апреля 2011

Я ожидал, что этот фрагмент кода создаст исходный вектор, но отсортированный без учета регистра.Вместо этого я получаю оригинальный вектор нетронутым.Почему мой компаратор не работает?

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")

Ответы [ 2 ]

15 голосов
/ 14 апреля 2011

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")
1 голос
/ 14 апреля 2011

сравнение - это не предикат, это компаратор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...