我有一个有序的地图,如下:
{:a 1 :b 2 :c 3}
Run Code Online (Sandbox Code Playgroud)
:并给出一个排序列表,如:
[:c :a]
Run Code Online (Sandbox Code Playgroud)
:我想找到最简单的方法:
{c: 3 :a 1}
Run Code Online (Sandbox Code Playgroud)
: 有谁知道如何做到这一点?
更新:
(defn asort [amap order] (conj {} (select-keys amap order)))
(asort {:a 1 :b 2 :c 3} [:c :a] )
Run Code Online (Sandbox Code Playgroud)
我可能会将排序向量转换为哈希映射以快速查找排序索引,从而得到如下内容:
{ :c 0 :a 1 }
Run Code Online (Sandbox Code Playgroud)
有几种方法可以从seq/vector中自动执行此操作(例如,map使用range,然后reduce转换为{} assoc).将结果(或上面的文字地图)绑定到本地(带let),让我们调用它order-map.
然后过滤原始地图(m)的条目,只包括排序中包含的条目:
(select-keys m order)
Run Code Online (Sandbox Code Playgroud)
然后sorted-map-by使用比较器函数将过滤后的表达式的结果放回到新的有序映射(使用)中:
(fn [a b] (compare (order-map a) (order-map b)))
Run Code Online (Sandbox Code Playgroud)
请注意,如果您实际上并不需要它作为地图,并且序列可以,则可以使用sort-by使用相同顺序图的键功能.
把它放在一起,你得到:
(defn asort [m order]
(let [order-map (apply hash-map (interleave order (range)))]
(conj
(sorted-map-by #(compare (order-map %1) (order-map %2))) ; empty map with the desired ordering
(select-keys m order))))
Run Code Online (Sandbox Code Playgroud)
和:
=> (asort (apply sorted-map (interleave (range 0 50) (range 0 50))) (range 32 0 -1))
{32 32, 31 31, 30 30, 29 29, 28 28, 27 27, 26 26, 25 25, 24 24, 23 23, 22 22, 21 21, 20 20, 19 19, 18 18, 17 17, 16 16, 15 15, 14 14, 13 13, 12 12, 11 11, 10 10, 9 9, 8 8, 7 7, 6 6, 5 5, 4 4, 3 3, 2 2, 1 1}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2467 次 |
| 最近记录: |