如何使用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<? super T> 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个最大值的主要内容,如果未能解决你的问题,请参考以下文章
SharePoint:如何使用列表中的 CAML 查询获取前 5 条记录