以特定顺序返回clojure映射值的序列

时间:2011-08-25 01:18:38

标签: clojure

如果我有地图,例如,

(def mymap { :b 1 :a 2 :d 3 :e 4 :f 5})

我可以使用val来获取所有值的序列

(vals mymap)
;=> (1 2 3 4 5)

如何以我自己的自定义顺序获取值序列,以获取示例

;=> (4 2 3 1 5)

我最终想要做的是将值序列化为字符串,执行类似这样的操作

(defn serialize [m sep] (apply str (concat (interpose sep (vals m)) ["\n"])))

(此示例函数取自“将输入映射序列化为字符串”帖子)

但我需要指定val的顺序。

4 个答案:

答案 0 :(得分:25)

地图是其键的功能,因此您可以执行此操作:

(map mymap [:e :a :d :b :f])
=> (4 2 3 1 5)

答案 1 :(得分:4)

对于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)

答案 2 :(得分:0)

如果您想根据键对地图进行排序,然后获取值, Brian有一个关于如何使用sort-by

执行此操作的示例

或者您可以实施自己的sort comparator

答案 3 :(得分:0)

我不想排序(虽然感谢排序提示),我只想指定顺序 当我从地图中提取值时。 我找到了一种方法 - 解构地图。

(let [{:keys [a b d e f]} mymap]
   (println e a d b f))