2015-03-18 2 views
3

Я новичок в изучении Scala и буду благодарен за любые мысли по идиоматическому способу сделать следующее. Я хочу подсчитать вхождения слов последовательных букв в слово.scala count letter pairs в слове

Например, для слова «home» выход может быть Map("ho"->1,"om"->1,"me"->1). И для «lulu» результатом будет Map("lu"->2, "ul"->1).

Так выполняя простой подсчет однобуквенного может быть сделан как

"abracadabra".map(s => s).groupBy(identity).mapValues(_.length) 

Но я озадачен о том, как добавить в двубуквенных компонентах этой проблемы. Спасибо за ваши мысли.

ответ

6

Вы можете использовать .sliding:

scala> "abracadabra".sliding(2).toList.groupBy(identity).mapValues(_.length) 
res3: scala.collection.immutable.Map[String,Int] = 
     Map(br -> 2, ca -> 1, ab -> 2, ra -> 2, ac -> 1, da -> 1, ad -> 1) 

scala> "lulu".sliding(2).toList.groupBy(identity).mapValues(_.length) 
res4: scala.collection.immutable.Map[String,Int] = Map(ul -> 1, lu -> 2) 

Из документов:

Выдвижные: Группы элементов в блоках фиксированного размера пропусканием " раздвижные окна "над ними

1

Вы должны использовать sliding(2):

"abracadabra".sliding(2).toVector.map(s => s).groupBy(identity).mapValues(_.length) 
// Map(br -> 2, ca -> 1, ab -> 2, ra -> 2, ac -> 1, da -> 1, ad -> 1)