由于某种原因,当我输入一个带有“”等双空格的字符串时,函数不会从字符串中删除它们,当两个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)
}
}发布于 2020-03-12 05:18:38
它不能工作的原因是,当您调用一个递归方法时,它最终会返回其结果。清除双空格的代码不能保存结果。
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
}作为一个FYI,这里有一个不同的方法。
def songDecoder(song:String):String =
"(WUB)+".r.replaceAllIn(song, " ").trim发布于 2020-03-12 07:13:41
不如这样吧:
song.split(“(WUB)+”).mkString(“ “).trimhttps://stackoverflow.com/questions/60647816
复制相似问题