考虑以下代码
(def values [[1 2] [3 4] [5] [6 7] [8]])
(apply max-key count values)
; => [6 7]
它返回的是最后一个最大值[6 7]。为什么不是第一个最大值[1 2]呢?
实际上,"max-key"并不会保证返回哪个最大值。
考虑以下Scala中的示例
println(List(List(0, 1, 2), List(2, 3, 4), List(1), List(1, 2, 3)).maxBy(_.length))
> List(0, 1, 2)
相同的函数在Scala中返回的默认值是第一个最大值。
版本1.4文件"clojure/core.clj#4419-4426"中的代码如下
=======================
4419: (defn max-key
4420: "返回(k x),一个数,最大的x。"
4421: {:added "1.0"
4422: :static true}
4423: ([k x] x)
4424: ([k x y] (if (> (k x) (k y)) x y))
4425: ([k x y & more]
4426: (reduce1 #(max-key k %1 %2) (max-key k x y) more)))
=======================
我不确定返回最后一个候选者的动机是什么,但是我
建议以下两点
1. 使"max-key"和"min-key"在存在多个候选者时返回第一个最大/最小值。
这种行为在我看来似乎是更自然、更方便的,因为在大多数情况下,您想获取第一个"赢家"。
(例如,找到一个序列中的第一个最大向量)并且很少需要获取最后一个条目——在这种情况下
您可以在将序列提供给"max-key"之前执行"reverse",因此,似乎使"返回第一个最大值"的行为更有用。
第4424行的应为">="而不是">"。
2. 使"max-key"和"min-key"对返回的顺序作出保证,即哪个最大/最小值将被返回(第一个或最后一个)。
第4420行应说"返回(k x),一个数,最大的x。在多个匹配的情况下,将返回第一个最大值"或与之前相同的文档,但是说"将返回最后一个最大值"。