возвращать последовательность значений карты clojure в определенном порядке - PullRequest
12 голосов
/ 25 августа 2011

Если у меня есть карта, например,

(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"])))

(этот примерфункция была взята из записи "сериализация карты ввода в строку")

но мне нужно указать порядок значений.

Ответы [ 4 ]

25 голосов
/ 25 августа 2011

Карты являются функциями их клавиш, поэтому вы можете сделать это:

(map mymap [:e :a :d :b :f])
=> (4 2 3 1 5)
4 голосов
/ 25 августа 2011

Для 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)
0 голосов
/ 25 августа 2011

Я не хочу сортировать (хотя спасибо за советы по сортировке), я просто хочу указать порядок когда я вытащил значения с карты. Я нашел способ сделать это - уничтожить карту.

(let [{:keys [a b d e f]} mymap]
   (println e a d b f))
0 голосов
/ 25 августа 2011

Если вы хотите отсортировать карту в зависимости от ключей, а затем получить значения, у Брайана есть пример того, как это сделать, используя sort-by

Или вы можетепросто создайте свой собственный компаратор

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