我正在使用这两组键值对,它们由另一个函数返回。我想写一个总是找到最高键并返回其相应值的函数。在这个例子中,我将返回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)
我希望有所帮助。谢谢!
答案 0 :(得分:3)
此函数将以对数时间返回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]
答案 1 :(得分:1)
(as-> (apply merge pair)
merged
(->> merged
keys
(apply max)
merged))
请注意,当两张地图都有"最高" key,返回第二个的值。
答案 2 :(得分:0)
这是max-key
的一个很好的用例(请参阅this other SO question以获取其使用的一个很好的例子),我认为这有一个误导性的名称 - 它实际上做的是需要一个函数和集合,它返回集合中具有将函数应用于该项的最高结果的项。您可以使用函数key
,它返回键值对的键。
(请注意,您需要将地图连在一起,以便您使用单个键值对集合。)
(apply max-key key (concat {-99 0, 99 0} {-99 2, 499 2}))
;=> [499 2]
(second *1)
;=> 2
答案 3 :(得分:-1)
(defn val-for-max-key [maps]
(->> (map (partial apply max-key key) maps)
(apply max-key key)
val))
编辑: 误解了所需的回报值
答案 4 :(得分:-2)
({-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
。