使用stream api获取最大数量

use*_*115 0 java java-8

Stream<Integer> stream = Stream.of(2, 1, 3, 4, 2, 3, 2);
Run Code Online (Sandbox Code Playgroud)

如果数字出现的次数较多,则显示该数字,结果为2

Stream<Integer> stream = Stream.of(2, 1, 3, 4, 2, 3);
Run Code Online (Sandbox Code Playgroud)

如果多个数字出现的次数相同,则取最大数字,结果为 2

Optional<Map.Entry<Integer, Long>> sorted1 = stream.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
        .entrySet().stream().filter(k -> k.getValue() > 1).max(Comparator.comparing(Map.Entry::getValue));
        
Run Code Online (Sandbox Code Playgroud)

我已经编写了上述逻辑,但无法获取这两个结果。

Eti*_*ret 5

用于.thenComparing ()按值对具有相同计数的值进行排序。

\n
Optional<Entry<Integer, Long>> sorted1 = Stream.of (1, 2, 2, 3, 1)\n      .collect (Collectors.groupingBy (Function.identity (), Collectors.counting ()))\n      .entrySet ()\n      .stream ()\n      .filter (k -> k.getValue () > 1)\n      .max (Comparator.<Map.Entry<Integer, Long>, Long>comparing (Map.Entry::getValue)\n        .thenComparing (Map.Entry::getKey)\n      );\n
Run Code Online (Sandbox Code Playgroud)\n

注意:如果您\xe2\x80\x99只对值感兴趣,而不是计数,请.map (Map.Entry::getKey)在末尾添加。

\n

注意:该行filter (k -> k.getValue () > 1)意味着您\xe2\x80\x99将获得一个空的输入选项,例如 [1] 或 [1, 2, 3],这可能是也可能不是您想要的(删除它会分别导致 1 和3)。

\n