【问题标题】:return sequence of clojure map values in a specific order按特定顺序返回 clojure 映射值序列
【发布时间】:2011-08-25 10:55:08
【问题描述】:

例如,如果我有一张地图,

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

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

但我需要指定 vals 的顺序。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    地图是其键的功能,因此您可以这样做:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        如果您想根据键对地图进行排序,然后获取值, 布赖恩有一个例子,说明如何使用sort-by

        或者你也可以实现自己的sort comparator

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-17
            • 1970-01-01
            • 2013-08-10
            • 1970-01-01
            相关资源
            最近更新 更多