Переупорядочил вложенную отсортированную карту с Clojure - PullRequest
0 голосов
/ 06 октября 2018

У меня есть отсортированная карта:

 (def my-map {1 {:foo "String_1" :ordnen 5 } 
              2 {:foo "String_2" :ordnen 4} 
              3 {:foo "String_3" :ordnen 3} 
              4 {:foo "String_4" :ordnen 1} })

И мне нужно переупорядочить ее в порядке возрастания, используя значение, сохраненное в ключевом слове : ordnen .Итак, окончательная отсортированная карта будет выглядеть так:

  {4 {:foo "String_4" :ordnen 1}
   3 {:foo "String_3" :ordnen 3}
   2 {:foo "String_2" :ordnen 4} 
   1 {:foo "String_1" :ordnen 5 }}

Я пробовал:

(into (sorted-map-by (fn [key1 key2] (compare (:ordnen key1) (:ordnen key2)))) my-map)

, но я не понимаю, как получить и сравнить значение :ordnen .

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Сначала получите значение из карты, вызвав val, а затем в результирующей подкарте просто вытащите значение, соответствующее :ordnen, через ключевое слово:

(sort-by (comp :ordnen val) my-map)
0 голосов
/ 07 октября 2018
(into
 (sorted-map-by
  (fn [key1 key2]
    (compare
     [(get-in my-map [key1 :ordnen]) key1]
     [(get-in my-map [key2 :ordnen]) key2])))
 my-map)

Итак, вы хотите отсортировать по значению.В вашем случае значением является карта, а затем вам нужно отсортировать по значению ключа: ordnen на этой карте.(get-in my-map [key: ordnen]) - это значение, по которому вы хотите отсортировать, но вам нужно убедиться, что компаратор работает с уникальными значениями.Итак, мы делаем вектор значения и ключа.

Приведенный выше подход, предложенный Тейлором, не будет работать с неуникальными значениями.Я добавил еще одну запись для ordnen 4.

(def my-map {1 {:foo "String_1" :ordnen 5}
             2 {:foo "String_2" :ordnen 4}
             3 {:foo "String_2" :ordnen 4}
             4 {:foo "String_3" :ordnen 3}
             5 {:foo "String_4" :ordnen 1}})


(into (sorted-map-by
       (fn [key1 key2]
         (compare (:ordnen (get my-map key1))
                  (:ordnen (get my-map key2)))))
      my-map)

Запись карты с ключом 3 отсутствует.

{5 {:foo "String_4", :ordnen 1}, 4 {:foo "String_3", :ordnen 3}, 2 {:foo "String_2", :ordnen 4}, 1 {:foo "String_1", :ordnen 5}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...