Как вы используете sorted-map-by для сортировки карты по значению? - PullRequest
9 голосов
/ 07 октября 2009

Я вообще не могу понять документацию.

Я хочу отсортированную карту "xxx", которая сортирует карту по значению. Как мне это сделать?

Спасибо.

Ответы [ 2 ]

18 голосов
/ 15 июля 2010

Другим способом является сравнение значений из исходной карты в функции сравнения.

(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}
6 голосов
/ 07 октября 2009

Вы используете 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}

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

Нет способа иметь отсортированную карту, где карта сортируется по значениям. Если бы это было так, было бы невозможно найти запись по ключу, потому что вы не могли бы использовать порядок, чтобы определить, где находится запись (поскольку порядок не будет зависеть от ключа).

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