Создайте массив символов для String, используя функции java8 - PullRequest
3 голосов
/ 15 апреля 2020

I sh для создания целого числа []] для конкретной строки (состоящей только из строчных букв английского языка Engli sh) с использованием потокового API Java 8. Где arr [i] обозначает количество i-го символа словаря Engli sh (например, arr [0] = количество «a» в строке String, а arr [2] = количество «c» в строке String Это может быть просто сделано:

int[] arr = new int[26];
for(char c : str.toCharArray())
       arr[c-'a']++;

Или с помощью IntSream 2-ым способом:

int[] arr = IntStream.range('a','z'+1).map(i -> (int)str.chars().filter(c -> c == i).count()).toArray();

Но проблема со вторым подходом состоит в том, что строка обрабатывается 26 раз для каждый из символов от 'a' до 'z'

Можете ли вы предложить лучший способ добиться того же, используя API-интерфейс java8-stream?

PS: я знаю, что это можно сделать с помощью Map но мне нужно int []

Ответы [ 2 ]

7 голосов
/ 15 апреля 2020
int[] r = str.chars()
             .boxed()
             .reduce(new int[26], 
                     (a, c) -> { ++a[c - 'a']; return a; }, 
                     (a1, a2) -> a1);

Вы знаете, что первое проще и лучше. Мой ответ только доказывает, что это возможно с Stream API, и не предполагает, что вы должны go с ним. Лично я бы выбрал картографический подход как наиболее интуитивный.

Как указал @Holger, collect - лучший вариант здесь

str.chars()
   .map(c -> c - 'a')
   .collect(() -> new int[26], 
            (a, i)-> a[i]++, 
            (a1, a2) -> /* left as an exercise to the reader*/);
3 голосов
/ 15 апреля 2020

если вы хотите использовать потоки и придерживаться итеративного подхода, вы можете сделать это так:

final int count[] = new int[26];
test.chars().forEach(c -> count[c-'a']++);
...