Заголовок вопроса читается как «Scala count chars в строковой логической ошибке». Но вы используете карту, и вы хотите считать как ключи. Равные клавиши не допускаются в объектах карты. Следовательно, равные ключи устраняются в полученной карте, сохраняя только одну, потому что не допускается дублирование ключей. То, что вы хотите, может быть Seq кортежей вроде (count, char), например List [Int, Char]. Попробуйте это.
val x = "abcabca"
x.groupBy(identity).mapValues(_.size).toList.map{case (x,y)=>(y,x)}
scala> x.groupBy(identity).mapValues(_.size).toList.map{case (x,y)=>(y,x)}
res13: List[(Int, Char)] = List((2,b), (3,a), (2,c))
Вышеприведенный список содержит список и соответствующие символы в виде списка кортежей. Так вы действительно можете
Если вы попытаетесь преобразовать это в карту:
scala> x.groupBy(identity).mapValues(_.size).toList.map{case (x,y)=>(y,x)}.toMap
res14: scala.collection.immutable.Map[Int,Char] = Map(2 -> c, 3 -> a)
Так что это не то, что вы хотите явно.
Еще более сжато использовать:
x.distinct.map(v=>(x.filter(_==v).size,v))
scala> x.distinct.map(v=>(x.filter(_==v).size,v))
res19: scala.collection.immutable.IndexedSeq[(Int, Char)] = Vector((3,a), (2,b), (2,c))