scala - 简单的 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)
}
}
解决方案
它不起作用的原因是,当您调用递归方法时,它最终会返回结果。清除双空格的代码不会保存该结果。
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
推荐阅读
- html - 让徽标出现在导航栏的右侧
- javascript - JS/Vue:如何为美国自动完成选择下拉菜单?
- swift4.2 - iOS 12 存在(fromrootviewcontroller)导致应用程序冻结
- python - 为什么 pd.Series([np.nan]) | pd.Series([True]) 评估为 False?
- javascript - 从php返回数组值(图像文件名到javascript)
- python - 如何最有效地计算矩阵乘积的对角线
- python - ruamel.yaml 倾倒浮动时的奇怪行为
- c++ - (C++)处理链表时返回-1073741819(0xC0000005),但算法有效
- ros - 大型室内凉亭环境
- python - 经过多次训练后,TF 2.x 中的 CuDNN 崩溃