我无法使用带有sorted-map-by和apply的自定义比较器。如何使下面的表达式起作用 -
(apply sorted-map-by > {1 "ab" 3 "cs" 2 "vs"})
我得到以下异常 -
IllegalArgumentException没有为key提供的值:[3“cs”] clojure.lang.PersistentTreeMap.create(PersistentTreeMap.java:87)
答案 0 :(得分:5)
假设您想要使用现有地图对按键进行排序,可以使用into
:
(into (sorted-map-by >) {1 "ab" 3 "cs" 2 "vs"})
这是有效的,因为(sorted-map-by >)
会返回一个空的有序地图,因此使用into
和assoc
等函数会按预期工作,而地图会维护已排序的顺序。
;=> {3 "cs", 2 "vs", 1 "ab"}
sorted-map-by
函数适用于平面参数:
(sorted-map-by > 1 "ab" 3 "cs" 2 "vs")
;=> {3 "cs", 2 "vs", 1 "ab"}
将它应用于此地图会产生奇数个对:
(apply list {1 "ab" 3 "cs" 2 "vs"})
;=> ([1 "ab"] [2 "vs"] [3 "cs"])
它试图让每一个都成为前一个键的值,因此就是错误。
答案 1 :(得分:1)
如果在编译时未知传递给函数的参数数量,则使用apply
。所以最好的方法是使用
(into (sorted-map-by >) {1 "ab" 3 "cs" 2 "vs"})