Функция Simple Scala, не удаляющая двойные пробелы - PullRequest
0 голосов
/ 12 марта 2020

По какой-то причине, когда я вводю строку с двойными пробелами, такими как "", функция не удаляет их из строки и не удаляет их, когда они генерируются двумя WUB в строке

Например:

songDecoder ("WUBCATWUBWUBBALLWUB") выводит "CAT_ _BALL" (подчеркивания представляют пробелы)

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

def songDecoder(song:String):String = {
  val l = song.indexOf("WUB")

  if (song.contains("  ")) {
    val e = song.indexOf("  ")
    songDecoder(song.patch(e,Nil,1))
  }

  if (l==0) {
    val c = song.patch(l,Nil,3)
    songDecoder(c)
  }
  if (l== -1)
    song.trim
  else {
    val c = song.patch(l,Nil,2)
    val b = c.patch(l," ",1)
    songDecoder(b)
  }
}

Ответы [ 2 ]

4 голосов
/ 12 марта 2020

Причина, по которой он не работает, заключается в том, что когда вы вызываете рекурсивный метод, он в конечном итоге возвращает свой результат. Код, удаляющий двойной пробел, не сохраняет этот результат.

if (song.contains("  ")) {
  val e = song.indexOf("  ")
  songDecoder(song.patch(e,Nil,1)) //send patched song to decoder
}                                  //don't save returned string
//continue with unpatched song

Второй блок if также повторяется без сохранения результата.

if (l==0) {
  val c = song.patch(l,Nil,3)
  songDecoder(c)  //send patched song to decoder
}                 //don't save returned string
//continue with unpatched song

Вы можете удалить оба из этих if блоков, и вы получите те же результаты от вашего метода. Единственный код, который влияет на вывод, является окончательным if / else, и это потому, что он находится в конце блока кода метода. Поэтому, что бы if / else не выдало, метод возвращает.

if (l== -1)
  song.trim  //return the final result string
else {
  val c = song.patch(l,Nil,2) //remove one WUB
  val b = c.patch(l," ",1)    //replace with space
  songDecoder(b)  //return whatever the next recursion returns
}

Так же, как и к вашему сведению, здесь другой подход.

def songDecoder(song:String):String =
  "(WUB)+".r.replaceAllIn(song, " ").trim
0 голосов
/ 12 марта 2020

Как насчет чего-то вроде:

song.split(“(WUB)+”).mkString(“ “).trim
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...