Как вы используете sorted-map-by для сортировки карты по значению?

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

Мне нужна отсортированная карта «xxx», которая сортирует карту по значению. Как я могу это сделать?

Спасибо.


person unj2    schedule 06.10.2009    source источник
comment
Как объяснил @sepp2k, это обычно невозможно с отсортированными картами ядра Clojure — их порядок основан на порядке сортировки key. Ознакомьтесь с clojure.data.priority-map, чтобы найти абстракцию, которая поддерживает это.   -  person glts    schedule 24.06.2019


Ответы (2)


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

(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}
person Chad Braun-Duin    schedule 15.07.2010
comment
Осторожно, в вашем решении есть ошибка, проверьте это: (def my-map {:chad 3 :bob 5 :alice 3 :sammy 4}) С вашим решением :alice 3 будет отрезано от полученной карты. - person Alfredo Di Napoli; 28.03.2011
comment
@AlfredoDiNapoli Я заметил ту же проблему. Я смог исправить это, используя ‹= вместо сравнения в анонимной функции. - person Rafael; 09.10.2011
comment
Разве @Rafael не предлагает использовать <= вместо 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}

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

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

person sepp2k    schedule 06.10.2009
comment
На странице документа, я думаю, вы можете прочитать обратное значение. Если вы хотите отсортировать карту в соответствии со значениями,... clojuredocs.org/clojure_core/clojure.core/sorted-map-by - person tangrammer; 26.11.2013