java 8获取具有相同最大出现次数的元素

时间:2018-06-02 17:51:27

标签: java collections java-8

我有一个元素流,我想将它转换为另一个流,该流只包含在前一个流中出现最多的元素,假设我可能有多个具有相同出现次数的元素。

举个例子:

输入流:['A','B','A','B','C','C','A','B']

输出流:['A',B']因为它们在前一个流中的最大出现次数等于3。

到目前为止,我已经编写了以下代码:

"\"

但这允许我只获得一个具有最大出现次数的元素,对于上面的情况,它将给出'A'或'B'。

使用lambdas有什么优雅的方法可以实现吗?

谢谢,干杯

2 个答案:

答案 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]

<强>更新

我已根据以下评论更改了答案。