-->

Clojure中的最高音键的返回值(Return value of highest key in C

2019-10-21 02:41发布

我与这两组键值对,它正被另一个函数返回工作。 我想编写一个函数,总能找到的最高键,并返回相应的值。 在这个例子中,我会返回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)

我希望帮助。 谢谢!

Answer 1:

这个函数会返回一个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]


Answer 2:

(as-> (apply merge pair)
      merged
      (->> merged
           keys
           (apply max)
           merged))

请注意,当两个地图都有一个“最高”键,则返回第二个值。



Answer 3:

这是一个很好的用例max-key (见本其他SO问题,其使用的一个很好的例子),我认为有一种误导的名字-它实际上做的是它需要一个功能集合,它具有应用功能,该项目的最高结果集合中返回的项目。 您可以使用功能key ,返回键-值对的关键。

(请注意,您需要Concat的您的地图在一起,使你与键值对的单一收集。)

(apply max-key key (concat {-99 0, 99 0} {-99 2, 499 2}))
;=> [499 2]

(second *1)
;=> 2


Answer 4:

(defn val-for-max-key [maps]
  (->> (map (partial apply max-key key) maps)
       (apply max-key key)
       val))

编辑:误解了所需的返回值



Answer 5:

({-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



文章来源: Return value of highest key in Clojure