我与这两组键值对,它正被另一个函数返回工作。 我想编写一个函数,总能找到的最高键,并返回相应的值。 在这个例子中,我会返回2,因为499是最高的关键。 我正在处理的数据是
({-99 0, 99 0} {-99 2, 499 2})
当我打电话
(type ({-99 0, 99 0} {-99 2, 499 2}))
内负责其返回该数据的功能,我回来
(clojure.lang.PersistentTreeMap clojure.lang.PersistentTreeMap)
我希望帮助。 谢谢!
这个函数会返回一个Clojure的最右边的入口有序映射(内置的实现被称为clojure.lang.PersistentTreeMap
)在对数时间 :
(defn rightmost
"Takes a Clojure sorted map sm and returns the entry at the greatest
key (as determined by sm's comparator)."
[sm]
(first (rseq sm)))
例:
(rightmost (sorted-map 1 1 2 2 3 3))
;= [3 3]
然后捞出即可使用该值val
功能。
所有的max-key
/ apply max
线性的基于时间的解决方案,而不是工作。 不用说,这是一个巨大的差异。
如果其他功能可能被说服重返data.avl地图替代,你可以使用在对数时间任何索引访问元素nth
:
;; works for data.avl sorted maps, not the built-ins
(nth (avl/sorted-map 1 1 2 2 3 3) 2)
;= [3 3]
(as-> (apply merge pair)
merged
(->> merged
keys
(apply max)
merged))
请注意,当两个地图都有一个“最高”键,则返回第二个值。
这是一个很好的用例max-key
(见本其他SO问题,其使用的一个很好的例子),我认为有一种误导的名字-它实际上做的是它需要一个功能集合,它具有应用功能,该项目的最高结果集合中返回的项目。 您可以使用功能key
,返回键-值对的关键。
(请注意,您需要Concat的您的地图在一起,使你与键值对的单一收集。)
(apply max-key key (concat {-99 0, 99 0} {-99 2, 499 2}))
;=> [499 2]
(second *1)
;=> 2
(defn val-for-max-key [maps]
(->> (map (partial apply max-key key) maps)
(apply max-key key)
val))
编辑:误解了所需的返回值
({-99 0, 99 0} {-99 2, 499 2})
是一个查找操作,其中{-99 0, 99 0}
是一个字典和{-99 2, 499 2}
是一个关键。 因为后者不是前者的关键,表达式将返回nil。
当我评价(type ({-99 0, 99 0} {-99 2, 499 2}))
我得到nil
,因为类型nil
也是nil
。