代码标识数组中最接近0的整数,如果有2个或更多值满足此条件,则返回值应为null . 问题是当我使条件返回null时,它会显示错误,因为函数应该返回一个整数 .
static int function(int [] arr){
int closest=arr[0];
for(int i=1;i<arr.length;i++){
if(Math.abs(arr[i])<closest){
arr[i]=closest;
}
else if(arr[i]==closest){
return null;
}
}
return closest;
}
我是Java的新手(以前学过Python),如果有更好/更有效的方法来解决这个问题请分享 .
3 回答
显而易见的答案是返回
Integer
而不是int
.Autoboxing将负责包装原语; autounboxing将负责为您的客户提供代码
NullPointerException
.但是你说效率很高,但是分配一个真正的对象效率不高(小值将使用一个共同的对象,但仍然不是很好) . 抛出异常的效率会更低(假设它经常发生 . )
例程可能返回任何
int
值,我们想要推出额外可能的outcode . 因此,有一种可能性是将一个更大并返回long
,并将Long.MIN_VALUE
作为特殊值 . 可能需要在客户端代码上进行强制转换才能返回int
.Long.MIN_VALUE
很有意思Long.MIN_VALUE == Math.abs(Long.MIN_VALUE)
.在这一点上,我们意识到代码中似乎存在一个错误(不确定,因为我真的知道它应该做什么) .
Integer.MIN_VALUE
始终如此 . 可能你想换掉它 .在进行比较之前转换为
long
也是可能的,但不那么聪明 . (整数溢出 - bleurgh . )绕过这个问题的另一种方法是让客户端代码选择一个合适的值来发出相同的信号,就像
null
应该指示的那样 .如果你需要支持
null
(例如Python的None
),那么你应该返回包装类型Integer
.您可以将返回类型转换为
Integer
,它可以容纳null
并自动将box和unbox转换为int:然而,这可能不是最好的解决方案 . 您可以改为返回
Integer.MAX_VALUE
来表示两个元素从零开始等距离 . 这取决于你计划如何处理有两个与0
距离相等的元素的情况 .