如何找到数组中最大值的索引?

16

上面的标题总结了我的问题,为了澄清事情,这里给出一个示例:

array[0] = 1
array[1] = 3
array[2] = 7  // largest
array[3] = 5

所以我希望得到的结果为2,因为它包含最大的元素7。


8
你目前已经尝试了什么? - Abimaran Kugathasan
2
可能是重复问题:如何使用Java在数组中找到最大的整数 - robertoia
1
有比排序更简单(更快)的事情... - Betlista
3
我会尽力为您翻译:从我这里收到了负面评价——我希望看到你付出一些努力。这不是一个困难的挑战。请自行努力。 - Duncan Jones
1
抱歉,我对编程还比较新,这并不是一个完全重复的链接,因为我不想返回最大幅度,而是最大幅度的索引。我现在会去看答案,看看是否适用于我,谢谢。 - Dave Lim
显示剩余4条评论
9个回答

25
int maxAt = 0;

for (int i = 0; i < array.length; i++) {
    maxAt = array[i] > array[maxAt] ? i : maxAt;
}

@Duncan 谢谢你的提示,已经修复了。 - ifloop
@if循环并不是固定的。循环的第一次迭代会因为异常(超出范围-1)而崩溃...编辑:我看到你已经纠正了它。 - Eric
@Duncan,抱歉我把你和作者搞混了——我的错。 - Eric
4
如果从“1”开始循环可能更加简洁。此外,您无法区分空数组和仅包含一个元素的数组。 - Boris Brodski
正如Boris所建议的那样,从1开始是有意义的。 - Tarik

15
public int getIndexOfLargest( int[] array )
{
  if ( array == null || array.length == 0 ) return -1; // null or empty

  int largest = 0;
  for ( int i = 1; i < array.length; i++ )
  {
      if ( array[i] > array[largest] ) largest = i;
  }
  return largest; // position of the first largest found
}

1
你不需要存储“largest”。 - Duncan Jones
1
@Duncan,没错,但是这样做会更加“易读”一些 ;) - Eric
1
同意不同意 :-) 我认为 indexOfLargest 作为一个单一、自说明的变量就足够了。 - Duncan Jones
1
我不会这么想。为了避免疑虑,这就是我的建议(复制到IDE中以获得良好的格式!):int indexOfLargest = 0; for ( int i = 0; i < array.length; i++ ) { if ( array[i] > array[indexOfLargest] ) { indexOfLargest = i; }}。基本上与ifLoop的答案相同。 - Duncan Jones
2
@Duncan 我会从1开始循环,而不是0 - Boris Brodski
显示剩余2条评论

4

一种方法是:

 Integer[] array = new Integer[4];
    array[0] = 1;
    array[1] = 3;
    array[2] = 7;
    array[3] = 5;

    List<Integer> iList = Arrays.asList(array);
    System.out.println(iList.indexOf(Collections.max(iList)));
    System.out.println(iList.indexOf(Collections.min(iList)));

这并没有找到索引。 - Duncan Jones
1
如果数组已经是Integer类型,那么这是一个不错的解决方案。但很遗憾,在许多情况下,它并不是这样的,而且没有一种愉快的方法在两者之间移动(没有外部库的情况下)。 - Duncan Jones
如果值是可重复的,该怎么办? - Jafar Ali
如果值是可重复的,则将考虑具有重复值的索引的第一个出现。 - Shekhar Khairnar

2
public int getIndexOfMax(int array[]) {
    if (array.length == 0) {
        return -1; // array contains no elements
    }
    int max = array[0];
    int pos = 0;

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

1
请查看下面的代码。
Integer array[] = new Integer[4];
array[0] = 1;
array[1] = 3;
array[2] = 7;
array[3] = 5;

List < Integer > numberList = Arrays.asList(array);

int index_maxNumber = numberList.indexOf(Collections.max(numberList));

System.out.println(index_maxNumber);

1
另一个功能实现。
int array[] = new int[]{1,3,7,5};        

int maxIndex =IntStream.range(0,array.length)
              .boxed()
              .max(Comparator.comparingInt(i -> array[i]))
              .map(max->array[max])
              .orElse(-1);

1
使用Java 8 流:
    List<Integer> list = Arrays.asList(1, 3, 7, 5);
    IntStream.range(0, list.size())
            .reduce((i, j) -> list.get(i) > list.get(j) ? i : j)
            .getAsInt();

1

两行代码可以高效地完成这个任务

//find the maximum value using stream API of the java 8

Integer max =Arrays.stream(numbers) .max(Integer::compare).get();
// find the index of that value
int index  = Arrays.asList(numbers).indexOf(max);

1
到目前为止最优雅的解决方案,但由于Java流实现,效率不是很高。C#通过数组实现的IEnumerable接口做得更好。 - Tarik

0

我会这样做(因为我不知道任何预定义的函数来获取最高元素的索引,只有元素本身,当然你可以使用list.indexOf(element)来获取索引,但需要将数组转换为列表并进行2次迭代):

maxIndex = 0;
for (int i = 0; i < array.length; i++) {
    if (array[i] > array[maxIndex]) {
        maxIndex = i;
    }
}

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