clojure - 如何在 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
,但我无法应用这种排序。
有任何想法吗?
(编辑:问题不在于没有维护顺序。实际的问题是如何使映射中的键符合指定的顺序。映射将来自其他地方并在中间进行转换,所以无论如何,不可能从一开始就以正确的顺序获得它)。
解决方案
我想这会让你到达那里
(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-map
with 序列vector-seq
推荐阅读
- visualization - 如何向此 Vega 可视化添加图例
- javascript - 使用花括号的 Javascript 属性声明
- html - 我的一个 div 被幻象顶部填充所困扰,似乎忽略了我的 css 文件
- python - numpy 数组上的 lambda 函数。这段代码有什么问题?
- mysql - Mysql 查询分组和限制 1 Desc
- carousel - 如何调整引导轮播以调整图像大小并使图像可链接?
- typescript - String.fromCharCode vs '0x' 的 TypeScript 错误
- php - Laravel 将外部 url 渲染为路由内容
- python-2.7 - 如何使用 Scrapy formRequest 抓取 casenet?
- java - 使用 Split 、 toCharArray 和 Equals 方法比较字符串