19
Янв
2016

Подсчет количества вхождений букв в строку с помощью потока (Stream)

Есть определенная строка(например "Some example"). Нужно определить количество вхождений каждой буквы в строке с помощью потока Stream и при этом без использования циклов, if и прочего(лишь рекурсия, потоки Stream и его методы вроде map, reduce, filter).

Я сделал из строки массив символов, который потом превратил в список c помощью рекурсивного метода toCharList.

String text = "Some example".toLowerCase.replaceAll("\\s", "")
List<Character> textInChar = toCharList(text.toCharArray(), 0);

static public List<Character> toCharList(char[] textChars, int i) {

    if(textChars.length == i) return new ArrayList<>();

    List<Character> ret =  new ArrayList<>();
    ret.add(textChars[i]);
    ret.addAll(toCharList(textChars, i + 1));


    return ret;
}

Затем из этого списка создал хэш-мапу c помощью перегруженного метода toCharMap. Таким образом получил я список всех не повторяющихся букв, которые есть в строке.

Map<Character, Integer>  countChar = toCharMap(textInChar);

public static Map<Character, Integer> toCharMap(List<Character> l) {
    return toCharMap(l.iterator());
}


public static Map<Character, Integer> toCharMap(Iterator it) {
    if (!it.hasNext()) return new HashMap<>();

    Map<Character, Integer> ret = new HashMap<>();
    ret.put((Character)it.next(), 0);
    ret.putAll(toCharMap(it));

    return ret;
}

Но как теперь их посчитать в потоке, например с помощью filter и reduce?

Источник: https://ru.stackoverflow.com/questions/484076/%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D0%B5%D1%82-%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0-%D0%B2%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B1%D1%83%D0%BA%D0%B2-%D0%B2-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D1%83-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0-stream

Тебе может это понравится...

Добавить комментарий