无法获得sort-map-by并一起应用工作

时间:2013-03-24 14:56:48

标签: clojure

我无法使用带有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)

2 个答案:

答案 0 :(得分:5)

假设您想要使用现有地图对按键进行排序,可以使用into

(into (sorted-map-by >) {1 "ab" 3 "cs" 2 "vs"})

这是有效的,因为(sorted-map-by >)会返回一个空的有序地图,因此使用intoassoc等函数会按预期工作,而地图会维护已排序的顺序。

;=> {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"})