And*_*sky 4 java collections java-8
我有一个元素流,我想将它转换为另一个流,该流只包含在前一个流中出现次数最多的元素,假设我可能有多个出现次数相同的元素。
举个例子:
输入流:['A', 'B', 'A', 'B', 'C', 'C', 'A', 'B']
输出流:['A', B'] 因为它们在前一个流中的最大出现次数都等于 3。
到目前为止,我已经编写了以下代码:
stream.collect(toMap(w -> w, w -> 1, Integer::sum))
.entrySet()
.stream()
.max(comparing(Map.Entry::getValue))
.map(Map.Entry::getKey);
Run Code Online (Sandbox Code Playgroud)
但这使我只能获得出现次数最多的元素之一,对于上述情况,它会给出“A”或“B”。
有没有什么优雅的方法可以使用 lambda 来实现这一点?
谢谢,干杯
没有一种简单的方法可以一次性完成,但是您可以对地图进行排序以找到最大值,或者只是使用IntStream::max来查找它,然后过滤地图以查找与该值匹配的所有条目:
var map = Stream.of('A', 'B', 'A', 'B', 'C', 'C', 'A', 'B')
.collect(toMap(w -> w, w -> 1, Integer::sum));
int max = map.values().stream()
.mapToInt(n -> n)
.max().orElse(0);
map.entrySet().stream()
.filter(e -> max == e.getValue())
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
输出:
A=3
B=3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1213 次 |
| 最近记录: |