使用Clojure对嵌套排序映射重新排序
我有这张分类地图:使用Clojure对嵌套排序映射重新排序,clojure,Clojure,我有这张分类地图: (def my-map {1 {:foo "String_1" :ordnen 5 } 2 {:foo "String_2" :ordnen 4} 3 {:foo "String_3" :ordnen 3} 4 {:foo "String_4" :ordnen 1} }) 我需要使用:ordnen关键字中保留的值以上升的方式对其重新排序。因此,最终排序的地图如下所示: {4 {:
(def my-map {1 {:foo "String_1" :ordnen 5 }
2 {:foo "String_2" :ordnen 4}
3 {:foo "String_3" :ordnen 3}
4 {:foo "String_4" :ordnen 1} })
我需要使用:ordnen关键字中保留的值以上升的方式对其重新排序。因此,最终排序的地图如下所示:
{4 {:foo "String_4" :ordnen 1}
3 {:foo "String_3" :ordnen 3}
2 {:foo "String_2" :ordnen 4}
1 {:foo "String_1" :ordnen 5 }}
我试过:
(into (sorted-map-by (fn [key1 key2] (compare (:ordnen key1) (:ordnen key2)))) my-map)
但是我不知道如何正确地获取和比较:ordnen的值
(into
(sorted-map-by
(fn [key1 key2]
(compare
[(get-in my-map [key1 :ordnen]) key1]
[(get-in my-map [key2 :ordnen]) key2])))
my-map)
所以你想按值排序。在您的示例中,该值是映射,然后需要根据该映射中:ordnen键的值进行排序。(get in my map[key:ordnen])是您想要排序的值,但是您需要确保比较器处理唯一的值。所以我们做了一个值和键的向量
泰勒建议的上述方法不适用于非均匀值。我又添加了一个ordnen 4条目。
(def my-map {1 {:foo "String_1" :ordnen 5}
2 {:foo "String_2" :ordnen 4}
3 {:foo "String_2" :ordnen 4}
4 {:foo "String_3" :ordnen 3}
5 {:foo "String_4" :ordnen 1}})
(into (sorted-map-by
(fn [key1 key2]
(compare (:ordnen (get my-map key1))
(:ordnen (get my-map key2)))))
my-map)
缺少键为3的地图条目
{5 {:foo "String_4", :ordnen 1}, 4 {:foo "String_3", :ordnen 3}, 2 {:foo "String_2", :ordnen 4}, 1 {:foo "String_1", :ordnen 5}}
首先通过调用
val
从映射中获取值,然后在生成的子映射中,通过关键字拉出与:ordnen
对应的值:
(sort-by (comp :ordnen val) my-map)
这是一个很好的解决方案,简洁明了。只是有点吹毛求疵,op说他想要的是一个排序映射,但这给了你一个向量序列。排序映射:(into{}(sort by(comp:ordnen val)my map))你也可以提供一个比较器作为排序依据的第二个参数。假设您想要排序:ordnen以降序方式。(进入(分类地图)(排序方式(comp:ordnen val)>我的地图))Thx,问题:为什么“[(进入我的地图[key1:ordnen])key1]”而不仅仅是“(进入我的地图[key1:ordnen])”?因为分类地图在引擎盖下的工作方式。如果提供用于比较的任何键相等,则在构建结果排序的映射时,它们会像重复使用assoc一样进行处理。因此,这里存在数据丢失的可能性。例如,如果执行(->{}(assoc:a1)(assoc:a2)),则:a处的值1将被2覆盖。我们确保要比较的参数是唯一的,因此我们使用向量对:ordnen值和映射项的键(键1和键2保证是唯一的,因此[ordnen val key1]和[ordnen val key2]也是唯一的。