为什么Guava中的空数组的最大值和最小值会抛出IllegalArgumentException?

时间:2014-02-27 17:29:41

标签: java guava

我正在阅读Guava的代码Ints.max(int... array)(同样地,Ints.minLongs.min等等。)如果IllegalArgumentException,他们会抛出array.length == 0(这是番石榴15.0)。

我想知道为什么他们在这种情况下不返回“身份元素”,而不是抛出异常。 “身份元素”是指产品的行为类似1,或者总和为0。 也就是说,我希望Ints.min()Integer.MAX_VALUEInts.max()Integer.MIN_VALUE,依此类推。

这背后的基本原理是,如果将数组拆分为两个,则整个数组的最小值必须是两个子数组的分钟之间的最小值。或者,对于数学倾斜,空集实数的总和为0,乘积为1,空集合的集合为空集,依此类推。

由于Guava库往往是精心制作的,我想必须有一个解释,在这里抛出异常。所以问题是:为什么?

编辑:据我所知,大多数人都希望数组的最大值和最小值是数组的元素,但这是因为两个元素的最大值/最小值始终是其中之一。另一方面,如果将max / min视为(可交换的)二进制操作,则返回identity元素更有意义。对我来说。

3 个答案:

答案 0 :(得分:8)

因为,恕我直言,在99.99%的情况下,当你问一个数组的最小元素时,你想得到这个数组的一个元素,而不是一些任意的大值。因此,大多数情况下,空阵列是一种特殊情况,需要特定的处理。因此,不处理这种特殊情况就是一个错误,由异常发出信号。

答案 1 :(得分:3)

你自己说了 -

  

这背后的基本原理是,如果将数组拆分为两个,则整个数组的最小值必须是两个子数组的分钟之间的最小值。或者,对于数学倾斜,空集实数的总和为0,乘积为1,空集合的集合为空集,依此类推。

所以[-1] = [-1] union []但是max([ - 1])!= max([ - 1] union [])。我同意,对于产品或总和,返回相应的身份更有意义,但不是最大/最小。

我也更喜欢max / min(S)是S的元素的属性。不是某些元素与小于和大于的相关。

特别是如果我在一个有很多负数的领域工作 - 比如加拿大北部的温度 - 那天我的温度样本是空的,因为温度计坏了 - 它不应该随机地显示为相对非常温暖的一天。

答案 2 :(得分:2)

数组值的最小值/最大值必须来自该数组。如果数组为空,那么就没有值了。在这里返回Integer.MAX_VALUE OR Integer.MIN_VALUE是错误的,因为这些值不在数组中。数组中没有任何内容。在数学上,答案是空集,但这不是可能的int值中的有效值。没有可能的int正确答案,因此唯一可行的正确做法是抛出Exception