如何使用 java 流从列表中获取前 5 个最大值

How to get the top 5 max values from a list using java stream

我有一个整数列表

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();

但只得到一个值元素。

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

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 个最大元素。

I have tried by using Java stream API, but get only one value,

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

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

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

方法 sorted 将按升序排序,请继续阅读:

sorted() Returns a stream consisting of the elements of this stream, sorted according to natural order.

但是,我们可以使用 sorted(Comparator<? super T> comparator) 其中:

Returns a stream consisting of the elements of this stream, sorted according to the provided 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]

按自然顺序获取 5 个最大值
两者都适用于 列表大小 < 5 w/o 异常

使用 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() );