[英]Return value of highest key in Clojure
我正在使用这两组键值对,它们由另一个函数返回。 我想编写一个始终会找到最高键并返回其对应值的函数。 在此示例中,我将返回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问题 ),我认为它的名称具有误导性-实际上,它的作用是需要一个函数和一个集合,并且它返回集合中将函数应用到该项目的结果最高的项目。 您可以使用function key
,它返回键值对的键。
(请注意,您需要将地图合并在一起,以便使用键值对的单个集合。)
(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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.