1. 概述

在Java中处理数组时,我们经常需要查找数组中最大值的索引。这个任务看似简单,但在实际开发中却很常见,比如找出游戏最高分、记录最高温度等场景。

本文将介绍几种简单高效的实现方式,帮助你在不同场景下灵活选择。

2. 问题说明

查找数组中最大元素的索引在多种场景下都很有用。假设我们有这样一个int数组:

static final int[] ARRAY = { 1, 2, 7, 10, 8, 6 };

显然,10是数组中的最大值,其索引为3。接下来我们将以ARRAY为例,探索几种获取索引3的方法。

注意:为简化讨论,我们假设:

  • 输入数组包含唯一的最大值
  • 跳过输入验证(如null检查)
  • 使用单元测试验证结果

3. 将数组转换为List

第一种思路:先找到最大值,再获取其索引。虽然查找最大值很简单,但Java数组没有提供indexOf(element)方法

我们知道ListindexOf()方法,所以可以先将数组转为List

int indexOfTheMax(int[] array) {
    List<Integer> list = Arrays.stream(array)
      .boxed()
      .toList();
    int max = Collections.max(list);
    return list.indexOf(max);
}

这段代码做了两件事:

  1. 使用Stream API将原始int数组转换为Integer列表
  2. 通过Collections.max()找到最大值

⚠️ 注意:max()方法返回Optional对象,我们用orElse(-1)处理空数组情况。

测试验证:

int result = indexOfTheMax(ARRAY);
assertEquals(3, result);
 
result = indexOfTheMax(new int[] {});
assertEquals(-1, result);

虽然可行,但这种方法需要多次遍历数组,效率不高。

4. 遍历数组

更高效的方式是直接遍历数组:

int indexOfTheMaxByLoop(int[] array) {
    if (array.length == 0) {
        return -1;
    }
    int idx = 0;
    for (int i = 1; i < array.length; i++) {
        idx = array[i] > array[idx] ? i : idx;
    }
    return idx;
}

核心逻辑:

  1. 初始化idx=0(假设第一个元素最大)
  2. 遍历数组,当发现更大元素时更新idx
  3. 返回最终索引

测试验证:

int result = indexOfTheMaxByLoop(ARRAY);
assertEquals(3, result);
 
result = indexOfTheMaxByLoop(new int[] {});
assertEquals(-1, result);

✅ 这种方法只需单次遍历,时间复杂度O(n),是最高效的解决方案。

5. 使用Stream API

如果你更喜欢函数式风格,可以用Stream API实现类似逻辑:

int indexOfTheMaxByStream(int[] array) {
    return IntStream.range(0, array.length)
      .boxed()
      .max(Comparator.comparingInt(i -> array[i]))
      .orElse(-1);
}

关键点:

  1. 使用range()创建索引流(而非元素流)
  2. 通过Comparator比较元素值
  3. orElse(-1)处理空数组

测试验证:

int result = indexOfTheMaxByStream(ARRAY);
assertEquals(3, result);
 
result = indexOfTheMaxByStream(new int[] {});
assertEquals(-1, result);

⚠️ 虽然代码简洁,但性能略低于传统循环(Stream API有额外开销)。

6. 总结

在Java中查找数组最大值索引有多种实现方式:

方法 优点 缺点 适用场景
转List法 代码直观 多次遍历 简单场景
传统循环 性能最佳 代码稍长 性能敏感场景
Stream API 函数式风格 性能略低 代码简洁性优先

推荐选择

  • 追求性能 → 传统循环
  • 代码简洁 → Stream API
  • 快速实现 → 转List法

完整示例代码可在GitHub获取。


原始标题:Find the Index of the Largest Value in an Array | Baeldung