我有一个元素流,我想将它转换为另一个流,该流只包含在前一个流中出现最多的元素,假设我可能有多个具有相同出现次数的元素。
举个例子:
输入流:['A','B','A','B','C','C','A','B']
输出流:['A',B']因为它们在前一个流中的最大出现次数等于3。
到目前为止,我已经编写了以下代码:
"\"
但这允许我只获得一个具有最大出现次数的元素,对于上面的情况,它将给出'A'或'B'。
使用lambdas有什么优雅的方法可以实现吗?
谢谢,干杯
答案 0 :(得分:4)
没有简单的方法可以一次性完成,但您可以对地图进行排序以找到最大值,或者只需使用Mumbai 0 Very poor
Mumbai 4 Poor
Mumbai 30 Fair
Mumbai 58 Good
Mumbai 8 Excellent
.....
.....
来查找它,然后过滤地图以查找与该值匹配的所有条目:
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);
答案 1 :(得分:1)
这应该适合你。
final List<Character> maxOccuringChars = chars.stream()
.collect(Collectors.collectingAndThen(Collectors.groupingBy(Function.identity(), Collectors.counting()),
map -> map.entrySet().stream()
.filter(entry -> entry.getValue().longValue() == map.entrySet().stream()
.max(Map.Entry.comparingByValue()).get().getValue().longValue())
.map(Map.Entry::getKey).collect(Collectors.toList())));
输出
[A, B]
<强>更新强>
我已根据以下评论更改了答案。