Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 为什么我的表达式没有在Scala中返回?_String_Scala_Methods_Return_Substring - Fatal编程技术网

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)
}