如何在Clojure中进行max-by操作?

12
如果我有一个由(defrecord Person [name age])定义的记录序列,我想获取年龄最大的人的记录,是否有比以下方法更简单的方法?
(reduce #(if (> (:age %1) (:age %2)) %1 %2) people)

这是我目前想到的唯一方法,但似乎这应该是一个常见的场景,因此必须存在一些内置的库函数可以使其更加容易和/或通用。

2个回答

21

clojure.core/max-key 是完成这项工作的合适工具。

 (apply max-key :age [{:age 12} {:age 20} {:age 30}]) ;; -> {:age 30}

max-key 做的事情和问题中展示的 reduce 是一样的 :) - Ankur
1
是的 :) 我在想使用 compare 而不是 > 是否是一个好主意呢?也就是说,max-key 可以处理任意值而不仅仅是数字(如文档中所述)。 - deprecated

1
(last (sort-by :age [{:age 12} {:age 20} {:age 30}]))

sort-by使用compare函数


2
这会不必要地增加时间复杂度的一个 log(n) 因子。 - David Ongaro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接