如何一次性获取数组的索引和最大值?

Sri*_*i K 11 java-8 java-stream

给定一个整数元素列表,如何一次性获取最大值及其索引.如果有多个元素具有相同的最大值,则返回任何一个元素的索引就可以了.

例如:

// Initialize list of integer
List<Integer> intList = Arrays.asList(5, 8, 3, 2);
// To get max value
Optional<Integer> maxVal = intList.stream().reduce(Integer::max);
// But how could I also get its index without iterating the array again?
Run Code Online (Sandbox Code Playgroud)

如果我只需要做一次,我可以对数组进行排序并得到第一个或最后一个(基于排序顺序).但是,我想看看如何在没有排序的情况下做到这一点.

Hol*_*ger 12

通常,如果您需要索引,则必须对索引进行流式处理.然后,任务变得直截了当:

List<Integer> intArr = Arrays.asList(5, 8, 3, 2);
IntStream.range(0, intArr.size())
  .reduce((a,b)->intArr.get(a)<intArr.get(b)? b: a)
  .ifPresent(ix->System.out.println("Index "+ix+", value "+intArr.get(ix)));
Run Code Online (Sandbox Code Playgroud)

一个更优雅的解决方案,不幸的是结合了拳击开销

IntStream.range(0, intArr.size())
  .boxed().max(Comparator.comparing(intArr::get))
  .ifPresent(ix->System.out.println("Index "+ix+", value "+intArr.get(ix)));
Run Code Online (Sandbox Code Playgroud)

  • @Chetan Kinger:你是对的,没有`Comparator <int>`所以,`IntStream`不提供`max(Comparator)`方法,但只有`max()`这对这里没有帮助(同样适用于`min`或`sorted`,`IntStream`仅支持自然顺序). (3认同)