在Java中寻找数组中最小元素的索引

5
我正在尝试编写一段代码块,它以整数数组作为参数,并返回数组中最小元素的索引。此外,如果列表为空列表,则该函数应返回-1。

Test for the block of code.

到目前为止,我已经得到了:

public static int indexOfSmallest(int[] array){
    int index = 0;
    int min = array[index];

    for (int i = 1; i < array.length; i++){
        if (array[i] <= min){
        min = array[i];
        index = i;
        }
    }
        return index;
}

但是,我遇到了这个错误,不确定需要修复什么。

enter image description here

任何帮助都将不胜感激。谢谢。
4个回答

5
错误已经很明显了。你没有处理空输入数组的情况。
public static int indexOfSmallest(int[] array){

    // add this
    if (array.length == 0)
        return -1;

    int index = 0;
    int min = array[index];

    for (int i = 1; i < array.length; i++){
        if (array[i] <= min){
        min = array[i];
        index = i;
        }
    }
    return index;
}

如果最小元素出现多次,并且您想返回其第一次出现的索引,请将条件更改为:

if (array[i] < min) 

这帮了很多忙,但现在我运行这个测试时又出现了另一个错误。int[] numbers = new int[]{100, 4, 16, 15, 4}; System.out.print(indexOfSmallest(numbers)); - user430574
2
@user430574,你有两个包含最小数的索引。你需要返回它们中的第一个还是最后一个?如果是第一个,请将 if (array[i] <= min) 改为 if (array[i] < min) - Eran
这是第一个。去掉'='符号就解决了。谢谢你的帮助。 - user430574
1
我会使用if/else条件语句来避免多个返回语句。 - NielsNet
@NielsNet 我很喜欢这种方法,因为多个return也意味着需要执行的代码更少,这对于内存和性能来说更好。 - Adi219

0
如果您的“numbers”数组为空,并且“index”声明为0,则“min = array [index]”将导致错误,因为您正在尝试访问空列表的不存在的第一个元素。
您应该插入一个“if”(在“for”循环之前),检查“numbers”数组是否为空。

0

你之所以会收到IndexOutOfBoundsException异常,是因为你在以下这行代码中试图从一个空数组中检索值:

int min = array[index];

在这行代码之前,使用以下方法检查数组是否为空:

 if(array.length < 1) return -1;

0
public static int indexOfSmallest(int[] arr) {
    int imin = 0;
    for (int i = 1; i < arr.length; i++) {
        if (arr[i] < arr[imin]) {
            imin = i;
        }
    }
    return imin;
}

或者

int min = Arrays.stream(arr).min().orElseThrow();
int imin = Arrays.stream(arr).boxed().collect(Collectors.toList()).indexOf(min);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接