String 为什么我的表达式没有在Scala中返回?
我有以下代码:String 为什么我的表达式没有在Scala中返回?,string,scala,methods,return,substring,String,Scala,Methods,Return,Substring,我有以下代码: def foo(str: String, key: Char) : String = { breakable{ for(it <- 0 until str.length){ if(str.charAt(it) != key){ str.slice(0, it) + str.slice(it+1, str.length) break } } } str } def foo(str:Stri
def foo(str: String, key: Char) : String = {
breakable{
for(it <- 0 until str.length){
if(str.charAt(it) != key){
str.slice(0, it) + str.slice(it+1, str.length)
break
}
}
}
str
}
def foo(str:String,key:Char):String={
易碎的{
对于(它str是一个val,在您的操作中它不会被更新…您正在忽略该字符串添加的结果
您的代码基本上与以下代码完全相同:
def foo(str: String, key: Char) : String = str
如果您希望不断更新结果,请尝试使用var,或者在不使用var的情况下使用字符串上的其他方法来实现相同的结果。使用var可以是这样的:
import util.control.Breaks._
def foo(str: String, key: Char) : String = {
var bar = str
breakable {
for(it <- 0 until str.length){
if(str.charAt(it) != key){
bar = str.slice(0, it) + str.slice(it+1, str.length)
break
}
}
}
bar
}
必须分两部分完成。首先,在字符串中找到此字符的索引(如果存在)。现在,如果找到索引,则返回切片字符串,否则返回原始字符串
我假设您不能使用一些字符串方法来直接执行此操作
如果您使用的是Scala 2.13
def foo(string:string,key:Char):string={
瓦尔指数选择=
一串
.lazyZip(LazyList.from(0))
.find({case(c,i)=>c==key})
.map({case(c,i)=>i})
指数选择
.map(index=>string.slice(0,index)+string.slice(index+1,string.length))
.getOrElse(字符串)
}
或者,如果您使用的是Scala 2.12
def foo(string: String, key: Char): String = {
val indexOption =
string
.toStream
.zipWithIndex
.find({ case (c, i) => c == key })
.map({ case (c, i) => i })
indexOption
.map(index => string.slice(0, index) + string.slice(index + 1, string.length))
.getOrElse(string)
}
在scala中,如果没有return关键字,将返回最后一个句子。由于最后一个句子是str
,因此将返回此值。您在代码中没有以任何方式更改str
。似乎您试图找到一些非法符号并将其从字符串中删除,只需使用replaceFirst方法:str.re即可placeFirst(key.toString,“”)
比这更复杂,我只是发布了问题的关键部分。由于抄袭原因,我不能发布其余部分。我所需要的是当if语句为真时,能够返回str.slice(0,It)+str.slice(It+1,str.length)
。if(){v}
无else
返回一个单位
,无论v
的类型是什么。此代码有几种代码气味。既然你说这是一项任务,那么值得一提的是你是什么,不允许做什么。我不允许使用“var”作为此任务的规则。好吧,那是另一回事……我只是尝试了一下o解释一下你的方法有什么问题……你可能想尝试使用递归方法来做这件事,或者使用折叠,但breakable会返回给你一个单位,所以你需要修改一些东西。因为我认为这是一个作业,我想让你看看foldLeft或foldRight,你应该会没事的……我想你从来没有被要求过sted要使用Breakables是否可以让投票人就这个答案的错误提供一些反馈?@LuisMiguelMejíaSuárez我的投票是第二个,是在评论之后添加的。我与第一个投票的神秘所有者和神秘原因完全无关。find
+map
基本上是collectFirst
。另外,我想最好只使用迭代器.zipWithIndex
,它与两个版本的Scala(以及2.11
兼容)。
def foo(string: String, key: Char): String = {
val indexOption =
string
.toStream
.zipWithIndex
.find({ case (c, i) => c == key })
.map({ case (c, i) => i })
indexOption
.map(index => string.slice(0, index) + string.slice(index + 1, string.length))
.getOrElse(string)
}