Настроить groupBy - PullRequest
       3

Настроить groupBy

0 голосов
/ 19 марта 2019

У меня есть эта строка на входе:

1 2 lucky 4 buzz fizz  

, и я пытаюсь получить следующий вывод

 fizz: 1 buzz: 1 fizzbuzz: 0 lucky: 1 integer: 3

, используя следующий код:

Pattern.compile(" ").splitAsStream(input).collect(groupingBy((val -> val.equals("fizz") ? "fizz"
            : val.equals("buzz") ? "buzz"
            : val.equals("lucky") ? "lucky"
            : "integers"),Collectors.counting())).toString();
}

Я прочитал этот хороший урок https://blog.indrek.io/articles/creating-a-collector-in-java-8/, но он кажется слишком сложным, чтобы достичь чего-то такого простого.Можете ли вы показать мне, как добиться этого с помощью потоков Java?

ВОПРОС ОБНОВЛЕНО, ИСПРАВЛЯЯ НЕПРАВИЛЬНЫЙ КОД

1 Ответ

2 голосов
/ 19 марта 2019

Во-первых, вы можете просто использовать логику отображения значений. Поскольку вы утверждаете , что слова, отличные от 4 слов, перечисленных в желаемом выводе, не могут произойти, вам просто нужно сопоставить любое числовое значение со словом "целое число":

groupingBy(s -> Character.isDigit(s.charAt(0)) ? "integer" : s, ...)

Во-вторых, нужно подсчитать пропущенные слова, но grouping() не может придумать группы для пропущенных слов.

Проще всего было бы добавить недостающие группы по факту:

List.of("fizz", "buzz", "fizzbuzz", "lucky", "integer")
    .forEach(s -> map.putIfAbsent(s, 0L));

Наконец, вы хотите, чтобы результат был разделен пробелом, используя : между ключом и значением, поэтому вы не можете (ну, не должны) использовать Map.toString() метод.

String input = "1 2 lucky 4 buzz fizz";
Map<String, Long> map = Pattern.compile(" ").splitAsStream(input)
        .collect(groupingBy(s -> (Character.isDigit(s.charAt(0)) ? "integer" : s), counting()));
List.of("fizz", "buzz", "fizzbuzz", "lucky", "integer")
    .forEach(s -> map.putIfAbsent(s, 0L));
String output = map.entrySet().stream()
                   .map(e -> e.getKey() + ": " + e.getValue())
                   .collect(Collectors.joining(" "));
System.out.println(output);

выход

lucky: 1 integer: 3 fizz: 1 fizzbuzz: 0 buzz: 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...