Я вообще не могу понять документацию.
Мне нужна отсортированная карта «xxx», которая сортирует карту по значению. Как я могу это сделать?
Спасибо.
Я вообще не могу понять документацию.
Мне нужна отсортированная карта «xxx», которая сортирует карту по значению. Как я могу это сделать?
Спасибо.
Другой способ — сравнить значения исходной карты в функции сравнения.
(def my-map {:chad 3 :bob 5 :sammy 4})
;; sort by keys ascending
(into (sorted-map) my-map)
=> {:bob 5, :chad 3, :sammy 4}
;; sort by values ascending
(into (sorted-map-by (fn [key1 key2] (compare (key1 my-map) (key2 my-map)))) my-map)
=> {:chad 3, :sammy 4, :bob 5}
;; sort by values descending
(into (sorted-map-by (fn [key1 key2] (compare (key2 my-map) (key1 my-map)))) my-map)
=> {:bob 5, :sammy 4, :chad 3}
<=
вместо compare
, связывая мой код с реализацией sorted-map-by
? Clojure Docs ссылается на этот вариант использования sorted-map-by
и предлагает такое решение: (into (sorted-map-by (fn [key1 key2] (compare [(key1 my-map2) key1] [(key2 my-map2) key2]))) my-map2)
вместо этого
- person mjaskowski; 18.04.2014
Вы используете sorted-map-by, указав сравнение, за которым следуют пары ключ-значение. Компаратор — это функция, которая принимает два ключа и возвращает -1, 0 или 1 в зависимости от того, является ли первый ключ меньше, равен или больше второго ключа.
Пример:
user=> (sorted-map-by (fn [k1 k2] (compare (mod k1 10) (mod k2 10))) 10 1 23 4 2 5)
{10 1, 2 5, 23 4}
Поскольку функция сравнения принимает в качестве аргументов только ключи, вы не можете использовать ее для сортировки по значениям.
Невозможно иметь отсортированную карту, где карта отсортирована по значениям. Если бы это было так, было бы невозможно найти запись по ключу, потому что вы не могли бы использовать порядок, чтобы определить, где находится запись (поскольку порядок не зависел бы от ключа).