【问题标题】:How to get index of multiple maximum value in List如何在List中获取多个最大值的索引
【发布时间】:2017-02-24 08:28:14
【问题描述】:

在给定的整数列表中,我想在列表中找到最大值的多重索引。

例如,

List<Integer> len=Arrays.asList(9,3,6,5,4,9);

现在我想找到最大的元素,即 9,它的所有索引都是 0 和 5。

我尝试了以下代码,但它只给了我第一次出现的元素,所以从这段代码中我得到的输出只有 0 而不是 5。

IntStream.range(0,len.size()).reduce((a, b) -> len.get(a) < len.get(b)?b:a).ifPresent(ix -> System.out.println("Index -"+ix));

那么我该如何实现呢?

【问题讨论】:

    标签: java list lambda java-8


    【解决方案1】:

    类似这样的:

    int max = len.stream().max(Integer::compareTo).get();
    System.out.println(IntStream.range(0, len.size()).filter(ix -> len.get(ix).intValue() == max).boxed()
                .collect(Collectors.toList()));
    

    【讨论】:

    • 当然你必须处理 max 不存在的情况
    • 但这会流式传输两次......如果它可以用单个流完成的话会很有趣。
    • .intValue() 是不必要的。 Java 会自动拆箱。
    • 将第一行更改为int max = len.stream().mapToInt(Integer::intValue).max().orElse(0); 将解决@grozandrei 提出的问题。
    • 可以使用 int max = Collections.max(len);获取最大值的函数
    【解决方案2】:

    可以只使用一个Stream管道:

    List<Integer> len = Arrays.asList(9, 3, 6, 5, 4, 9);
    
    List<Integer> indices = IntStream.range(0, len.size()).boxed()
        .collect(Collectors.collectingAndThen(
            Collectors.groupingBy(len::get, TreeMap::new, Collectors.toList()),
            m -> m.isEmpty() ? Collections.emptyList() : m.lastEntry().getValue()));
    System.out.println(indices);
    

    首先将您的索引分组到列表中的相应值。然后你必须决定如果中间映射是空的怎么办。您要么抛出NoSuchElementException,要么返回一个空列表。在我的示例中,我选择了后一种情况。


    结果:

    [0, 5]

    【讨论】:

    • 相当不错:) 一加
    【解决方案3】:

    如果结果不必是StreamOptional,您可以使用以下代码完成任务:

    IntStream.range(0, len.size()).boxed()
        .sorted(Comparator.comparing((Integer i) -> len.get(i)).reversed())
        .reduce(-1, (ixMax, ix) -> {
            if (ixMax == -1 || len.get(ixMax) == len.get(ix)) {
                System.out.println("Index -" + ix);
                return ix;
            } else {
                return ixMax;
            }
        });
    

    虽然回答了这个问题,但说实话,它可能既不简洁也不高效。通过一些工作,应该可以将 if-else 块替换为使用Optional 的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 2015-03-03
      相关资源
      最近更新 更多