@n199a
Java

Как найти элементы в List, имеющие большее число вхождений в Java?

Есть список строк:
List<String> s = Arrays.asList("a", "a", "a", "b", "c");

Чтобы найти самый часто встречающуюся букву с помощью стирима:
// получим количество повторений по каждой букве (a = 3, b = 1, c = 1)
Map<String, Long> map= s.stream()
                    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

// Из этого списка уже получаем букву с самым большим количеством повторений (это буква "а")
Optional<String> mostCommon = map.entrySet().stream()
            .max(Map.Entry.comparingByValue())
            .map(Map.Entry::getKey);


А как получить несколько букв , у которых будет равно максимальное количество повторений:
// a = 3 и b = 3
List<String> s = Arrays.asList("a", "a", "a", "b", "b", "b", "b", "c");


Пытался наподобие этого, но не выходит:
Set<Srring> mostWidelyUsed = map.entrySet().stream()
                    .map(v -> Collections.max(v, Map.Entry.comparingByValue()))
                    .collect(Collectors.toSet());
  • Вопрос задан
  • 877 просмотров
Решения вопроса 1
xez
@xez Куратор тега Java
TL Junior Roo
var s = Arrays.asList("a", "a", "a", "b", "b", "b", "c");

        var map = s.stream()
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

        var max = map.entrySet().stream()
                .max(Map.Entry.comparingByValue())
                .map(Map.Entry::getValue)
                .orElse(0L);

        var result = map.entrySet().stream()
                .filter(e -> e.getValue().equals(max))
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());  // [a, b]
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы