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

例如:

// 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?

如果只需要执行一次,则可以对数组进行排序并获得第一个或最后一个(基于排序顺序)。但是,我想看看我们如何不进行分类就可以做到这一点。

最佳答案

通常,如果您需要索引,则必须流式处理索引。然后,任务变得简单明了:

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)));
一个更优雅的解决方案,不幸的是,其中包含了拳击费用
IntStream.range(0, intArr.size())
  .boxed().max(Comparator.comparing(intArr::get))
  .ifPresent(ix->System.out.println("Index "+ix+", value "+intArr.get(ix)));

10-05 18:53