【问题标题】:Why max and min in Guava for empty arrays throw IllegalArgumentException?为什么空数组的 Guava 中的 max 和 min 会抛出 IllegalArgumentException?
【发布时间】:2014-02-27 17:29:41
【问题描述】:

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

我想知道为什么在这种情况下他们不返回“身份元素”,而不是抛出异常。我所说的“身份元素”是指表现得像 1 代表产品或 0 代表总和的元素。 也就是说,我希望Ints.min()Integer.MAX_VALUEInts.max()Integer.MIN_VALUE,等等。

这背后的基本原理是,如果将数组一分为二,则整个数组的最小值必须是两个子数组的最小值之间的最小值。或者,对于数学倾向来说,空实数集的和为 0,乘​​积为 1,空集的并集是空集,以此类推。

由于 Guava 库往往是精心制作的,我想这里抛出异常肯定有一个解释。那么问题来了:为什么?

编辑:我知道大多数人期望数组的最大值和最小值是数组的一个元素,但这是因为两个元素的最大值/最小值始终是其中之一。另一方面,如果将 max/min 视为(可交换的)二元运算,则返回标识元素更有意义。对我来说。

【问题讨论】:

  • 您可能需要询问 guava 开发人员。什么都没有的最小值/最大值是未定义的(恕我直言),所以番石榴的行为似乎很正常
  • 如果int[] 为空,您究竟要如何从int[] 返回 min 元素?任何int 值都可以在int[] 中找到它的位置,包括极端Integer.{MIN,MAX}_VALUE。就个人而言,我认为这种行为是合乎逻辑的。
  • 正如在下面的 bet 中发现的那样,还要注意 Haskell 不会这样做,这是一种真正受数学启发的语言。

标签: java guava


【解决方案1】:

因为,恕我直言,在 99.99% 的情况下,当您询问数组的最小元素时,您希望获得该数组的一个元素,而不是某个任意大的值。因此,大多数时候,空数组是一种特殊情况,需要特殊处理。因此,不处理这种特殊情况是一个错误,由异常发出信号。

【讨论】:

  • “因此,大多数时候,空数组是一种特殊情况”这是一个宗教问题。任何数学家都会更喜欢一个统一处理空集的证明或程序,并且不检查我敢打赌,在像 Haskell 这样的语言中实现 max 或 min 将符合 OP 的设计。
  • @LouisWasserman 哎哟。与 OP 的问题非常相关,如果 even 他们的数学语言没有以数学优雅的方式做到这一点,那么实际上可能有一个很好的理由不这样做。
  • 在阅读您的赌注之前我也尝试过 Haskell ;-) 如前所述,它们也会抛出异常。但是函数 or/and :: [Bool] -> Bool,从数学的角度来看与 max/min 非常相似,对于空列表确实分别返回 False 和 True。
【解决方案2】:

你自己说的——

这背后的基本原理是,如果将数组一分为二,则整个数组的最小值必须是两个子数组的最小值之间的最小值。或者,对于数学倾向来说,空实数集的和为 0,乘​​积为 1,空集的并集是空集,以此类推。

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

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

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

【讨论】:

  • 我的意思是 max([-1]) == max(max([-1]), max([]))。如果 max([]) 为 Integer.MIN_VALUE,则为真。
  • @matiasg 我明白了,是的,这些是身份。 Guava 对我来说似乎是一个合理甚至是好的设计决定,但我认为没有任何理论上的理由不喜欢你的。
【解决方案3】:

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

【讨论】:

  • 答案不能是空集,这根本没有意义(考虑min 一组总顺序的集合,你会明白为什么)。我同意您写的所有其他内容,尤其是答案必须来自该数组。这是最大和最高之间的区别。
猜你喜欢
  • 1970-01-01
  • 2019-08-25
  • 1970-01-01
  • 2014-04-28
  • 2011-12-27
  • 2022-01-18
  • 2012-08-26
  • 1970-01-01
  • 2015-08-08
相关资源
最近更新 更多