Различная сортировка по одному ключу Clojure - PullRequest
1 голос
/ 29 мая 2020

Привет, у меня есть этот код, но я хотел бы поменять местами только: a.

(sort-by (juxt :a :b) [{:a 1 :b 3} {:a 1 :b 2} {:a 2 :b 1}])
;;=> [{:a 1 :b 2} {:a 1 :b 3} {:a 2 :b 1}]

Я пробовал это, но это было в неправильном порядке.

(sort-by (juxt :a :b) #(compare %2 %1)  [{:a 1 :b 3} {:a 1 :b 2} {:a 2 :b 1}])
;;=> ({:a 2, :b 1} {:a 1, :b 3} {:a 1, :b 2})

I хотел бы получить.

;;=> ({:a 2, :b 1} {:a 1, :b 2} {:a 1, :b 3})

Есть идеи? Могу ли я сделать то же самое вместе?

Ответы [ 3 ]

5 голосов
/ 29 мая 2020
(sort-by (juxt (comp - :a) :b) [{:a 1 :b 3} {:a 1 :b 2} {:a 2 :b 1}])
2 голосов
/ 29 мая 2020

Этот и другие вопросы о компараторах и сортировке в Clojure рассматриваются в этой статье руководства: https://clojure.org/guides/comparators

0 голосов
/ 29 мая 2020

Вы можете попробовать последний макрос потока отсортировать сначала по :b, а затем отсортировать в обратном порядке по :a.

(->> [{:a 1 :b 3} {:a 1 :b 2} {:a 2 :b 1}]
     (sort-by :b)
     (sort-by :a #(compare %2 %1)))
...