Как сгруппировать похожие символы в строку в Scala? - PullRequest
0 голосов
/ 10 декабря 2018

Предположим, у меня есть строка как таковая:

val a = "aaaabbbcccss"

, и я хочу сгруппировать только a и b как:

"a4b3cccss"

У меня есть попытки a.toList.groupBy(identity).mapValues(_.size), ноэто возвращает карту без упорядочения, поэтому я не могу преобразовать ее в форму, которую я хочу.Мне было интересно, есть ли функция в Scala, которая может достичь того, что я хочу?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

В качестве альтернативы вы можете создать функцию, в которой вы можете указать свою строку и список символов, и использовать рекурсивный подход, при котором вы можете взять последовательные символы из списка, используя takeWhile.

, а затем удалитьиз списка, используя длину результата из takewhile, и добавьте в аккумулятор то, что вы хотите объединить, в строку acc, которая будет возвращена, когда список будет пустым.

def countSimilar(str: String, ch: List[Char]): String = {
  def process(l: List[Char], acc: String = ""): String = {
    l match {
      case Nil => acc
      case h :: _ =>
        val tw = l.takeWhile(_ == h)
        acc + process(
          l.drop(tw.length),
          if (ch.contains(h)) h + tw.length.toString else tw.mkString("")
        )
    }
  }

  process(str.toList)
}

println(countSimilar("aaaabbbcccss", List('a', 'b')))
println(countSimilar("aaaabbbcccssaaaabb", List('a', 'b', 'c')))

Это дастВы:

a4b3cccss
a4b3c3ssa4b2

См. Scala демо

0 голосов
/ 10 декабря 2018

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

val a = "aaaabbbcccss"
val p = """([ab])\1*""".r
println(p replaceAllIn (a, m => s"${m.group(1)}${m.group(0).size}") )

См. Scala demo

Соответствует регулярному выражению:

  • ([ab]) - Группа 1:a или b
  • \1* - ноль или более вхождений символа, захваченного в группу 1.

В заменяющей части m.group(1) - это захваченный символв группу 1 и m.group(0).size - размер всего совпадения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...