考虑以下代码
(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。返回值是number类型。"
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。当存在多个匹配项时,将返回第一个最大条目"或相同的文档,但说"将返回最后一个最大条目"。