Проблема с вашим подходом заключается в том, что вы сопоставляете количество символов с символами. Что есть: В случае
val str = abcabca
При перемещении строки str a имеет счет 3, b имеет счет 2, а c имеет счет 2 при создании карты (с использованием groupBy) он поместит все символы в значение, имеющее тот же самый ключ.
Map(3->aaa, 2->bc)
Именно по этой причине вы получаете такой вывод для своей программы.
Как вы можете видеть в определении функции groupBy:
def groupBy [K] (f: (A) ⇒ K): immutable.Map [K, Repr] Разделяет эту обходную коллекцию на карту пересекающихся коллекций в соответствии с некоторой дискриминаторной функцией. Примечание. Этот метод не переопределяется представлениями. Это означает, что при применении к виду он всегда будет заставлять представление и возвращать новую доступную коллекцию. K - тип ключей, возвращаемых функцией дискриминатора. f функция дискриминатора. возвращает карту из ключей в пересекающиеся коллекции, так что имеет место следующий инвариант: (xs groupBy f) (k) = xs filter (x => f (x) == k) То есть каждый ключ k связан с обходной коллекцией из тех элементов x, для которых f (x) равно k.
blockquote>GroupBy возвращает карту, которая содержит следующий инвариант.
(xs groupBy f)(k) = xs filter (x => f(x) == k)
Это означает, что он возвращает коллекцию элементов, для которых ключ такой же.