Как подсчитать количество последовательных вхождений символа в строку в Scala? - PullRequest
0 голосов
/ 13 января 2020

Допустим, у меня есть строка:

"AAAAA BBB CCCC AA"

Я хочу, чтобы я мог посчитать вхождения последовательных символов, чтобы получить строку, которая выглядит следующим образом:

"5A 3B 4C 2A"

Как я go об этом?

В настоящее время я пробовал циклически перебирать строку, и для каждого символа я использую регистр совпадений, и в каждом случае я начинаю новый l oop для подсчета сколько раз этот символ появляется последовательно, затем я пытаюсь заменить эту подстроку нужной подстрокой.

Ответы [ 2 ]

2 голосов
/ 13 января 2020

Создайте List из (n:Int, c:Char) кортежей, затем переформатируйте его в любое желаемое представление String.

"AAAAABBBCCCCAA".foldRight(List.empty[(Int,Char)]){
  case (c, hd::tl) if c == hd._2 => (hd._1 + 1, c) :: tl
  case (c, lst) => (1,c) :: lst
}.map(tup => s"${tup._1}${tup._2}").mkString(" ")
//res0: String = 5A 3B 4C 2A
1 голос
/ 13 января 2020

Для такого рода задач мне нравится писать свой собственный хвост-рекурсивный алгоритм.

def countConsecutiveCharacters(str: String): List[(Char, Int)] = {
  @annotation.tailrec
  def loop(remaining: List[Char], currentChar: Char, currentCount: Int,
           acc: List[(Char, Int)]): List[(Char, Int)] =
    remaining match {
      case char :: xs if(char == currentChar) =>
        loop(
          remaining = xs,
          currentChar,
          currentCount + 1,
          acc
        )

      case char :: xs =>
        loop(
          remaining = xs,
          currentChar = char,
          currentCount = 1,
          (currentChar -> currentCount) :: acc
        )

      case Nil =>
       ((currentChar -> currentCount) :: acc).reverse
    }

  str.toList match {
    case char :: list =>
      loop(
        remaining = list,
        currentChar = char,
        currentCount = 1,
        acc = List.empty
      )

    case Nil =>
      List.empty
  }
}

Вы можете проверить код, работающий здесь .

Вы можете заменить все это одним foldLeft, но ИМХО, этот способ чище и проще для чтения.

...