Вот решение с использованием groupBy
, которое группирует данные в соответствии с ключом, вычисленным из каждого значения данных.
val text = "This is a text file."
def vowels(s: String) = s.replaceAll("[^aeiou ]", "").sorted
text
.trim.split("\\s+")
.groupBy(vowels)
.collect{ case(k, v) => (k, v.length) }
Функция vowels
выделяет гласные из слова. Эта версия сортирует гласные, но не объединяет несколько экземпляров одного и того же гласного. Замените это точной операцией, которую вы хотите. Это может быть любая функция, которая извлекает важные характеристики из слова.
trim
и split
разбивают текст на слова, разделенные пробелами.
groupBy
группирует слова в соответствии с результатом vowels
.
collect
преобразует список, сгенерированный groupBy
в число.
Результат - Map[String, Int]
, но используйте toList
, если вам нужно List
вместо Map
.
Обновление для обработки гласных в верхнем регистре
Если вам нужно обработать гласные в верхнем регистре, есть три возможных маршрута.
1) Преобразовать строку в начале
.trim.toLowerCase.split("\\s+")
Это потенциально более эффективно, но, возможно, более логично поместить правила о случае гласных в vowels
check
2) Преобразовать строку в vowels
def vowels(s: String) = s.toLowerCase.replaceAll("[^aeiou ]", "").sorted
3) Добавьте прописные гласные к шаблону
def vowels(s: String) = s.replaceAll("[^AaEeIiOoUu ]", "").sorted
Это сохраняет случай гласных, которые могут или не могут быть тем, что хотели.