如果我有一个地图,例如,
(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"])))
(此示例函数取自"将输入映射序列化为字符串" post)
但是我需要指定值的顺序。
映射是键的函数,所以你可以这样做:
(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或者你可以使用sort-by,
(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)
如果您想根据键对映射进行排序,然后获取值,Brian有一个关于如何使用sort-by
来做到这一点的示例或者你可以实现你自己的排序比较器
我不想排序(尽管感谢排序技巧),我只想指定顺序当我从地图中提取值时。我找到了一种方法——解构地图。
(let [{:keys [a b d e f]} mymap]
(println e a d b f))