首页 > 解决方案 > 如何在 Clojure 映射中排序键?理想情况下,根据键向量对它们进行排序

问题描述

我找到了关于如何按值排序地图的不同解决方案,但没有找到关于如何让键以特定顺序出现的解决方案。

我们知道密钥是自动排序的,并且不会以插入方式出现,但是我们可以在之后以某种方式强制它吗?

例如,给定一个 map: (def my-map {:one 1 :two 2 :three 3 :four 4 :five 5}),我想更改它们的显示顺序。

所需的键在向量中 (def sorted-keys-here [:four :three :five :two :one])

这样,我希望地图出现在 sort-fn 应用为之后:

=> {:four 4 :three 3 :five 5 :two 2 :one 1}

键总是固定的,我会使用 对地图向量执行此操作map,但我无法应用这种排序。

有任何想法吗?

(编辑:问题不在于没有维护顺序。实际的问题是如何使映射中的键符合指定的顺序。映射将来自其他地方并在中间进行转换,所以无论如何,不​​可能从一开始就以正确的顺序获得它)。

标签: clojure

解决方案


我想这会让你到达那里

(def my-map {:one 1 :two 2 :three 3 :four 4 :five 5})
(map my-map [:four :three :five :two :one])  ;

你可以把你的通用键向量放在飞行中

(def vector-seq [:two :one])
(map my-map vector-seq)  ; this will return list
(mapv my-map vector-seq)  ; this will return vector

或者你可以做的是“加权”输入向量

(let [my-map {:one 1 :two 2 :three 3 :four 4 :five 5}
      vector-seq [:five :three :two :four :one]
      weight (apply hash-map (interleave vector-seq (range (count vector-seq))))]
  (into 
        (sorted-map-by 
            (fn [key1 key2]
                (> (get weight key2)
                  (get weight key1))))
        my-map ))

这将产生一个sorted-mapwith 序列vector-seq


推荐阅读