Clojure中最高键的返回值

时间:2014-10-01 16:45:44

标签: clojure treemap sortedmap

我正在使用这两组键值对,它们由另一个函数返回。我想写一个总是找到最高键并返回其相应值的函数。在这个例子中,我将返回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)

我希望有所帮助。谢谢!

5 个答案:

答案 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