代码标识数组中最接近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),如果有更好/更有效的方法来使用此代码,请分享。
答案 0 :(得分:3)
如果您需要支持null
(例如Python的None
),则应返回包装器类型Integer
。
static Integer function(int [] arr) {
// ...
}
答案 1 :(得分:3)
您可以将返回类型转换为Integer
,该类型可以容纳null
,并将自动装箱和拆箱为一个整数:
static Integer 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;
}
但是,这可能不是最佳解决方案。您可以改为返回Integer.MAX_VALUE
来表示其中两个元素与零等距。这取决于您打算如何处理两个元素与0
等距的情况。
答案 2 :(得分:2)
显而易见的答案是返回Integer
而不是int
。
static Integer function(int[] arr) {
自动装箱将包装原始图元。自动拆箱将为您提供客户代码NullPointerException
。
但是您说过有效,但是分配一个真正的对象并不有效(较小的值将使用一个公共对象,但这仍然不是很好)。抛出异常的效率甚至更低(假设它发生的频率足够高)。
该例程可能返回任何int
值,我们希望增加额外的输出代码。因此,一种可能是增大一个值,然后返回一个long
作为特殊值的Long.MIN_VALUE
。可能需要强制转换客户端代码以返回到int
。
static Integer function(int[] arr) {
Long.MIN_VALUE
有趣之处在于Long.MIN_VALUE == Math.abs(Long.MIN_VALUE)
。
在这一点上,我们意识到代码中似乎存在一个错误(不确定,因为我真的知道它应该做什么)。
if(Math.abs(arr[i])<closest){
Integer.MIN_VALUE
始终如此。可能您想与之交换。
if (-Math.abs(arr[i]) > -closest){
也可以在进行比较之前转换为long
,但不太聪明。 (整数溢出-故障)。
解决该问题的另一种方法是让客户端代码选择一个适当的值来表示与null
应该指示的内容相同的情况。
static int function(int[] arr, int dflt) {
[...]
} else if (arr[i] == closest) {
return dflt;
[...]