Java 为什么Guava中空数组的max和min抛出IllegalArgumentException?
我正在读番石榴的Java 为什么Guava中空数组的max和min抛出IllegalArgumentException?,java,guava,Java,Guava,我正在读番石榴的Ints.max(int…array)(类似地,Ints.min,Longs.min,等等),如果array.length==0(这是番石榴15.0),他们会抛出一个IllegalArgumentException 我想知道为什么在这种情况下他们不返回“identity元素”,而不是抛出异常。我所说的“标识元素”是指表现为1表示乘积,0表示总和的元素。 也就是说,我希望Ints.min()是Integer.MAX\u VALUE,Ints.MAX()是Integer.min\u
Ints.max(int…array)
(类似地,Ints.min
,Longs.min
,等等),如果array.length==0(这是番石榴15.0),他们会抛出一个IllegalArgumentException
我想知道为什么在这种情况下他们不返回“identity元素”,而不是抛出异常。我所说的“标识元素”是指表现为1表示乘积,0表示总和的元素。
也就是说,我希望Ints.min()
是Integer.MAX\u VALUE
,Ints.MAX()
是Integer.min\u VALUE
,依此类推
其基本原理是,如果将一个数组一分为二,则整个数组的最小值必须是两个子数组的最小值之间的最小值。或者,对于有数学倾向的,实数空集上的和为0,乘积为1,集合的空集合的并集为空集,依此类推
由于番石榴库往往是精心制作的,我想这里抛出异常肯定有一个解释。所以问题是:为什么
编辑:我知道大多数人希望数组的max和min是数组的一个元素,但这是因为两个元素的max/min总是其中之一。另一方面,如果将max/min视为(可交换的)二进制操作,则返回标识元素更有意义。对我来说。这是你自己说的-
其基本原理是,如果将一个数组一分为二,则整个数组的最小值必须是两个子数组的最小值之间的最小值。或者,对于有数学倾向的,实数空集上的和为0,乘积为1,集合的空集合的并集为空集,依此类推
所以[-1]=[-1]并集[],但是max([-1])!=最大([-1]联合[])。我同意,对于乘积或总和,返回各自的标识更为合理,但不返回max/min
我还喜欢max/min(S)是S的一个元素的属性,而不是与小于和大于无关的元素
特别是如果我在一个有很多负数的领域工作-比如加拿大北部的温度-我的温度样本因为温度计坏了而空了-它不应该随机显示为相对非常温暖的一天。因为,IMHO,在99.99%的情况下,当你问数组的最小元素时,您希望获取此数组的元素,而不是任意大的值。因此,在大多数情况下,空数组是一种特殊情况,需要进行特殊处理。因此,不处理这种特殊情况是一个错误,由异常发出信号。数组值的最小值/最大值必须来自该数组。如果数组为空,则没有可接受的值。此处返回Integer.MAX\u VALUE
或Integer.MIN\u VALUE
将是错误的,因为这些值不在数组中。数组中没有任何内容。从数学上讲,答案是空集,但这不是可能的int
值中的有效值。没有可能的int
正确答案,因此唯一可能的正确做法是抛出异常
您可能需要询问番石榴开发者。Min/max of nothing是未定义的(IMHO),因此番石榴的行为似乎正常。如果int[]
为空,您希望如何从int[]返回最小元素?任何int
值都可以在int[]
中找到它的位置,包括极端值整数。{MIN,MAX}\u值
。就我个人而言,我发现这种行为是合乎逻辑的。正如在下面的bet中发现的,还请注意Haskell不是这样做的,这是一种真正受数学启发的语言。我的意思是max([-1])==max(max([-1]),max([]))。如果max([])是整数,则为真。@matiasg我明白了,是的,这些是标识。番石榴对我来说似乎是一个合理甚至很好的设计决定,但我不认为有任何理论上的理由不喜欢你的。”因此,大多数时候,空数组是一种特殊情况“这是一个宗教问题。任何数学家都会喜欢一个统一处理空集的证明或程序,如果不检查的话,我会打赌用Haskell这样的语言实现max或min将符合OP的设计。@LouisWasserman ouch。与OP的问题非常相关,如果即使他们的mathy语言也没有以mathy优雅的方式来做,那么实际上可能有一个很好的理由不这样做。在阅读您的赌注之前,我也尝试过Haskell;-)如上所述,它们还抛出一个异常。但是函数或/和::[Bool]->Bool,从数学角度来看与max/min非常相似,对于空列表,它们分别返回False和True。答案不能是空集合,这一点都没有意义(考虑一组具有某种总顺序的集合的min
,您将看到原因)。我同意你写的所有其他东西,尤其是答案必须来自于这个数组。这是最大值和最大值之间的区别。