首页 > 解决方案 > 简单的 Scala 函数不删除双空格

问题描述

出于某种原因,当我输入带有双空格的字符串(例如“”)时,该函数不会将它们从字符串中删除,也不会在它们由两个 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)
  }
}

标签: scala

解决方案


它不起作用的原因是,当您调用递归方法时,它最终会返回结果。清除双空格的代码不会保存该结果。

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

推荐阅读