【发布时间】:2014-02-27 17:29:41
【问题描述】:
我正在阅读 Guava 的代码 Ints.max(int... array)(类似地,Ints.min、Longs.min 等)如果 array.length == 0(这是 Guava 15.0),他们会抛出 IllegalArgumentException。
我想知道为什么在这种情况下他们不返回“身份元素”,而不是抛出异常。我所说的“身份元素”是指表现得像 1 代表产品或 0 代表总和的元素。
也就是说,我希望Ints.min() 是Integer.MAX_VALUE,Ints.max() 是Integer.MIN_VALUE,等等。
这背后的基本原理是,如果将数组一分为二,则整个数组的最小值必须是两个子数组的最小值之间的最小值。或者,对于数学倾向来说,空实数集的和为 0,乘积为 1,空集的并集是空集,以此类推。
由于 Guava 库往往是精心制作的,我想这里抛出异常肯定有一个解释。那么问题来了:为什么?
编辑:我知道大多数人期望数组的最大值和最小值是数组的一个元素,但这是因为两个元素的最大值/最小值始终是其中之一。另一方面,如果将 max/min 视为(可交换的)二元运算,则返回标识元素更有意义。对我来说。
【问题讨论】:
-
您可能需要询问 guava 开发人员。什么都没有的最小值/最大值是未定义的(恕我直言),所以番石榴的行为似乎很正常
-
如果
int[]为空,您究竟要如何从int[]返回 min 元素?任何int值都可以在int[]中找到它的位置,包括极端Integer.{MIN,MAX}_VALUE。就个人而言,我认为这种行为是合乎逻辑的。 -
正如在下面的 bet 中发现的那样,还要注意 Haskell 不会这样做,这是一种真正受数学启发的语言。