Ответ 1
Карты - это функции их ключей, поэтому вы можете сделать это:
(map mymap [:e :a :d :b :f])
=> (4 2 3 1 5)
Если у меня есть карта, например,
(def mymap { :b 1 :a 2 :d 3 :e 4 :f 5})
Я могу использовать vals для получения последовательности всех значений
(vals mymap)
;=> (1 2 3 4 5)
как мне получить последовательность значений в моем собственном заказном порядке, чтобы получить, например,
;=> (4 2 3 1 5)
то, что я в конечном итоге хочу сделать, это сериализовать значения в строку, делая что-то вроде этого
(defn serialize [m sep] (apply str (concat (interpose sep (vals m)) ["\n"])))
(эта примерная функция была взята из сообщения "сериализовать входную карту в строку" )
но мне нужно указать порядок валов.
Карты - это функции их ключей, поэтому вы можете сделать это:
(map mymap [:e :a :d :b :f])
=> (4 2 3 1 5)
В версии 1.3 вы можете использовать карту приоритетов,
http://clojure.github.com/clojure-contrib/branch-master/priority-map-api.html
или вы можете использовать сортировку,
(let [m { 1 8 3 6 5 4 7 2}]
(println (map first (sort-by second m)))
(println (map first (sort-by first m))))
(7 5 3 1)
(1 3 5 7)
Если вы хотите отсортировать карту в зависимости от ключей, а затем получить значения, Брайан имеет пример, как это сделать, используя sort-by
Или вы можете просто реализовать собственный сортировщик сортировки
Я не хочу сортировать (хотя спасибо за советы по сортировке), я просто хочу указать порядок когда я вытаскиваю значения из карты. Я нашел способ сделать это - разрушить карту.
(let [{:keys [a b d e f]} mymap]
(println e a d b f))