我正在阅读Guava的代码Ints.max(int... array)
(同样地,Ints.min
,Longs.min
等等。)如果IllegalArgumentException
,他们会抛出array.length == 0
(这是番石榴15.0)。
我想知道为什么他们在这种情况下不返回“身份元素”,而不是抛出异常。 “身份元素”是指产品的行为类似1,或者总和为0。
也就是说,我希望Ints.min()
为Integer.MAX_VALUE
,Ints.max()
为Integer.MIN_VALUE
,依此类推。
这背后的基本原理是,如果将数组拆分为两个,则整个数组的最小值必须是两个子数组的分钟之间的最小值。或者,对于数学倾斜,空集实数的总和为0,乘积为1,空集合的集合为空集,依此类推。
由于Guava库往往是精心制作的,我想必须有一个解释,在这里抛出异常。所以问题是:为什么?
编辑:据我所知,大多数人都希望数组的最大值和最小值是数组的元素,但这是因为两个元素的最大值/最小值始终是其中之一。另一方面,如果将max / min视为(可交换的)二进制操作,则返回identity元素更有意义。对我来说。
答案 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
。