+-

我有一个元素流,我想将它转换为另一个流,该流只包含在前一个流中出现最多的元素,假设我可能有多个具有相同出现次数的元素.
举个例子:
输入流:[‘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);
但是这允许我只获得具有最大出现次数的一个元素,并且对于上面的情况,它将给出’A’或’B’.
有没有任何优雅的方式如何使用lambdas实现这一目标?
谢谢,干杯
最佳答案
这应该为你做的伎俩.
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]
更新
我根据下面的评论更改了答案.
点击查看更多相关文章
转载注明原文:java 8获取具有相同最大出现次数的元素 - 乐贴网