Goal:编写一个函数,生成一个排除指定字符(由索引标识)的新字符串
Example:
-
takeAllExcept(0, "abc")
回报bc
-
takeAllExcept(1, "abc")
回报ac
-
takeAllExcept(2, "abc")
回报ab
我最初做了什么:
def takeAllExcept( index: Int, s: String ): String = {
val lastIndex = s.length()-1
index match {
case 0 => return s.slice(1, s.length)
case lastIndex => return s.slice(0, s.length()-1)
case _ => { s.slice(0, index) + s.slice(index+1, s.length) }
}
}
编译器抱怨语句块 forcase _
无法到达。
我是如何修复它的
def takeAllExcept( index: Int, s: String ): String = {
val lastIndex = s.length()-1
if( index == 0 )
return s.slice(1, s.length)
if( index == lastIndex )
return s.slice(0, s.length()-1)
s.slice(0, index) + s.slice(index+1, s.length)
}
我想知道为什么我的最初尝试因无法访问的代码而失败。对我来说这看起来是合法的。另外,scala 中是否有内置的工具已经可以做到这一点?
lastIndex
模式中是一个新名称的隐式声明,该名称绑定到放入匹配中的任何值,并隐藏已定义的所有值lastIndex
,正如其他两篇文章已经指出的那样。除了使用大写标识符之外,还有其他两种可能性(请参阅 Peter 的帖子):
使用反引号让编译器知道这不应是新标识符的声明:
case `lastIndex` => ...
使用模式保护:
case x if x == lastIndex => ...
如果您想对字符串进行大量基于索引的删除,那么通过调用使用 Buffer 会更快toBuffer
在字符串上,然后你可以使用remove(i: Int)
缓冲区的方法。仅对于一项操作来说速度较慢,因为完成后您必须将缓冲区转换回字符串,但如果您执行许多随机访问操作,则速度会快得多。完成后您可以致电mkString
在缓冲区上取回你的字符串。对于单个删除,我会按照彼得的建议进行操作,或者这里有一个替代方案:
def takeAllExcept(i: Int, s: String) = s.take(i) + s.drop(i+1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)