如何使用 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() );
我有一个整数列表
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() );