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

Posted

技术标签:

【中文标题】如何使用java流从列表中获取前5个最大值【英文标题】:How to get the top 5 max values from a list using java stream 【发布时间】: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();

但只得到一个值元素。

【问题讨论】:

【参考方案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() );

【讨论】:

以上是关于如何使用java流从列表中获取前5个最大值的主要内容,如果未能解决你的问题,请参考以下文章

在java 8中通过流从1个列表的1个列表中获取所有对象?

如何使用流从两个列表或数组乘法中查找元素对

SharePoint:如何使用列表中的 CAML 查询获取前 5 条记录

如何获取在另一个列表中具有值的列表的最大值

如何使用来自外部设备的 setVideoURI 流从 android videoview 获取帧?

如何使用 bloc 未来获取流从后端过滤数据?