带有几个相等键的max-key和min-key

时间:2017-09-29 20:30:59

标签: clojure

没想过会这么说,但是来自c ++,我有时会想念Clojure中的c ++标准。让我们以max-key(或min-key为例):

(doc max-key)
;=clojure.core/max-key
;=([k x] [k x y] [k x y & more])
;=Returns the x for which (k x), a number, is greatest.

嗯,如果有几个项目具有相同的密钥怎么办? Clojuredocs没有更多相关信息。但实验表明:

(max-key count [1] [2])
;=[2]
(max-key count [1] [2] [3])
;=[3]

似乎总是返回具有最大键值的最后一个元素。

但这是真的吗?我怎么能确定?

2 个答案:

答案 0 :(得分:2)

由于未指定,因此无法保证。你不应该依赖这种行为。

当然,你可以通过阅读它来了解当前实施会发生什么:

(defn max-key
  "Returns the x for which (k x), a number, is greatest."
  {:added "1.0"
   :static true}
  ([k x] x)
  ([k x y] (if (> (k x) (k y)) x y))
  ([k x y & more]
   (reduce1 #(max-key k %1 %2) (max-key k x y) more)))

显然是偏右的,所以现在实施的你将获得所有合格的人中最正确的元素。但同样,因为没有保证,任何未来版本的Clojure都可能改变这种行为。

答案 1 :(得分:1)

ClojureDocs有a link to the source code(右上角),因此您可以查看详细信息并预测在任何特定情况下会发生什么。但是,当有多个答案可用时,通常不指定将返回哪个项目。此外,它可以随着Clojure的未来版本(以前发生过)而改变。

因此,如果您需要特定的结果(第一个,最后一个或其他内容),您可能需要编写一个包装函数,以便在输入模糊时强制执行所需的行为。