Есть определенная строка(например "Some example"). Нужно определить количество вхождений каждой буквы в строке с помощью потока Stream и при этом без использования циклов, if и прочего(лишь рекурсия, потоки Stream и его методы вроде map, reduce, filter).
Я сделал из строки массив символов, который потом превратил в список c помощью рекурсивного метода toCharList.
String text = "Some example".toLowerCase.replaceAll("\\s", "")
List
static public List
if(textChars.length == i) return new ArrayList<>();
List
return ret;
}
Затем из этого списка создал хэш-мапу c помощью перегруженного метода toCharMap. Таким образом получил я список всех не повторяющихся букв, которые есть в строке.
Map
public static Map
public static Map
Map
return ret;
}
Но как теперь их посчитать в потоке, например с помощью filter и reduce?
Ответ
1) Из строки массив символов лучше получать так:
String text = ("Some example").toLowerCase().replaceAll("\\s", "");
List
или:
textInChar = text.chars().mapToObj(e->(char)e).collect(Collectors.toList());
2) Xэш-мапу не повторяющихся символов лучше получить тогда уж так:
Map
А всю задачу я бы решил так:
textInChar = text.chars().mapToObj(e->(char)e).collect(Collectors.toList());
Map
Проверим:
countChar.forEach( (k, v) -> LOG.debug(k + " -> " + v));
Выведет:
p -> 1
a -> 1
s -> 1
e -> 3
x -> 1
l -> 1
m -> 2
o -> 1
UPD:
if(m.containsKey(c))
m.put(c, m.get(c) + 1);
else
m.put(c, 1);
Можно сократить до:
m.put(c, m.containsKey(c) ? (m.get(c) + 1) : 1);
Комментариев нет:
Отправить комментарий