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

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 来实现这一点?

谢谢,干杯

Dav*_*rad 5

没有一种简单的方法可以一次性完成,但是您可以对地图进行排序以找到最大值,或者只是使用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)

  • 好的!虽然我会使用 `.max().orElse(0);` 或 `.max().orElse(-1);` 来保证安全而不是 `.max().getAsInt();` (2认同)