【问题标题】:How to get the top 5 max values from a list using java stream如何使用java流从列表中获取前5个最大值
【发布时间】:2021-05-06 13:59:44
【问题描述】:

我有一个整数列表

List<Integer> lst = new ArrayList<>();
lst.add(10);
lst.add(15);
lst.add(16);
lst.add(8);
lst.add(100);
lst.add(1);
lst.add(40);

如何编写代码以便我可以从列表中获取前 5 个最大元素,即100, 40, 16, 15, 10

我已经尝试过使用 Java 流 API:

Integer var = lst.stream().max(Integer::compare).get();

但只得到一个值元素。

【问题讨论】:

    标签: java mapreduce java-stream reduce collect


    【解决方案1】:

    我尝试过使用 Java 流 API,但只得到一个值,

    整数变量 = lst.stream().max(Integer::compare).get();

    这将为您提供该列表的最大值。要获得前 5 名,您必须执行以下操作:

    lst.stream()
       .sorted(Comparator.reverseOrder())
       .limit(5)
       .collect(Collectors.toList());
    

    sorted 方法将按升序排序,如下所示:

    sorted() 返回一个由该流的元素组成的流, 按自然顺序排序。

    但是,我们可以使用sorted(Comparator&lt;? super T&gt; comparator)

    返回由该流的元素组成的流,已排序 根据提供的比较器。

    因此需要传递Comparator.reverseOrder() 进行降序排序。 limit(5) 将从流中提取前 5 个元素。

    一个更通用的方法:

    private static void printTop(Collection<Integer> col, int top) {
        List<Integer> collect = col.stream().sorted(Comparator.reverseOrder()).limit(top).collect(Collectors.toList());
        System.out.println(collect);
    }
    

    一个运行的例子:

    public static void main(String []args){
        List<Integer> lst = List.of(10, 15, 16, 8, 100, 1, 40);
        printTop(lst, 5);
    }
    
    private static void printTop(Collection<Integer> col, int top) {
        List<Integer> collect = col.stream().sorted(Comparator.reverseOrder()).limit(top).collect(Collectors.toList());
        System.out.println(collect);
    }
    

    输出:

    [100, 40, 16, 15, 10]
    

    【讨论】:

      【解决方案2】:
      List<Integer> lst = new ArrayList<>();
      lst.add(10);
      lst.add(15);
      lst.add(16);
      lst.add(8);
      lst.add(100);
      lst.add(1);
      lst.add(40);
      List<Integer> lst1 = lst.stream().sorted(Comparator.reverseOrder()).limit(5).collect(Collectors.toList());
      System.out.println(lst1);
      

      这可以帮助您获得前 5 个最大元素。

      【讨论】:

        【解决方案3】:

        您可以对 List 进行排序,然后弹出最后 5 个元素或前 5 个元素,具体取决于您实现 Comparable 方法的方式。

        【讨论】:

          【解决方案4】:

          按自然顺序获取 5 个最大值
          两者都适用于 list-size w/o exception

          带有 lambda (如 OP 所愿)

          int[] n = {0};
          List<Integer> rslt = lst.stream().sorted().dropWhile(
            i -> n[0]++ < Math.max(0, lst.size() - 5) ).collect( toList() );
          

          带有收集方法

          lst.sort( Integer::compare );
          List<Integer> rslt = lst.subList( Math.max(0, lst.size() - 5), lst.size() );
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-03-25
            • 1970-01-01
            • 2023-03-03
            • 2022-07-27
            • 2018-01-01
            • 1970-01-01
            • 2020-11-28
            • 2022-10-24
            相关资源
            最近更新 更多