我想知道是否有一个更好的,简短而优雅的方法来实现这一点比我正在尝试的。假设我有3个整数(value1,value2,value3),我想找到最大值的整数和空值是允许的。我不能使用下面的代码,因为它可能会抛出NullPointerException:
Math.max(Math.max(value1, value2), value3)
我已经写了一个野蛮的代码(如下所示),但它不会超过3个整数:
public Integer getMaxValue(Integer value1, Integer value2, Integer value3) {
Integer defaultValue = 1;
if (value1 == null && value2 == null && value3 == null) {
return defaultValue;
} else if (value1 == null && value2 != null && value3 != null) {
return Math.max(value2, value3);
} else if (value2 == null && value1 != null && value3 != null) {
return Math.max(value1, value3);
} else if (value3 == null && value1 != null && value2 != null) {
return Math.max(value1, value2);
} else if (value1 == null && value2 == null) {
return value3;
} else if (value2 == null && value3 == null) {
return value1;
} else if (value1 == null && value3 == null) {
return value2;
} else {
return Math.max(Math.max(value1, value2), value3);
}
}
6条答案
按热度按时间mccptt671#
不如
它处理任意数量的整数,其中任何一个或所有整数都可以为null。
您可以将其转换为返回
Optional<T>
而不是T
的泛型方法,因为T
没有通用的默认值。gajydyqb2#
我推荐使用Java Streams,它提供了一种非常简洁的方式来过滤空值并返回一个最大值,或者如果所有输入的数字都是空值,则返回默认值。
6ljaweal3#
这里有一个变体,如果你想要 * 最小值和最大值,并且你有一小部分数据驻留在内存中。
对于最小 * 和最大 *
定义一个record来保存结果。
一些示例数据。
在(a)跳过空值和(B)排序之后,从该列表中生成
Deque
。从双端队列中提取第一个(最小值)和最后一个(最大值)。构造一条
MinMax
记录。运行时:
minMax.toString()= MinMax[min=3,max=99]
如果输入列表不包含整数,则
MinMax
的两个字段都为空。如果输入列表包含1个整数,则
MinMax
的两个字段包含相同的数字。您可能希望向记录中添加一个名为
minEqualsMax
的方便方法,以查看两个字段是否具有相同的数字或都为null。我们可以将deque代码移动到记录
MinMax
上的静态工厂方法中。我们可以将此方法命名为fromList
,但实际上,此代码适用于任何Collection
。因此我们将其命名为fromCollection
。完整的类示例。
现在我们可以编写简单的代码,如:
演示代码。
运行时:
警告:如果元素数量非常大,或者元素没有全部加载到内存中,则排序的开销很大。对于这些情况,不要使用本答案的方法。但是对于常见情况,例如处理发票上的行项目,这种方法是合理的。
mm5n2pyu4#
下面是一个使用streams的一行程序解决方案:
这将创建一个包含三个值的
Stream
,过滤掉空值,对元素成对调用Math.max
,返回给定值,如果所有值都为空,则返回defaultValue
。bq3bfh9z5#
使用先决条件检查:
通过使用
Integer.MIN_VALUE
,您可以确保任何其他Integer
将大于(或等于)null
输入的结果。应该注意的是,在这种情况下,
getMaxValue(null, null, null)
将导致Integer.MIN_VALUE
。如果你想处理这种情况,那么你可以预先检查所有三个都为null,并相应地返回其他东西。(Note流解决方案对于N个输入工作良好,但在该特定情况下可能是过度的)。
k0pti3hp6#
另一种方法是先对空值进行排序:将你的值添加到一个列表中,按自然顺序排序,首先为null,检查排序后的最后一个元素是否为null,如果是,返回默认值,否则返回最后一个值: