使用foldLeft替换出现在字符串中的字符

问题描述 投票:0回答:1

[我正在尝试学习功能性Scala并解决一个简单的问题-替换出现在字符串中的\'\\

到目前为止是我的代码:

val data : String = "\' this is a test \\ "

    data.toCharArray.foldLeft(""){ (x, y) => x match {
      case Nil => y :: Nil
      case head :: tail =>
        if head == '\'' ''
        else if head == '\\' ''
        else head :: tail
    }

存在多个错误:

enter image description here

enter image description here

我不了解折叠的基本原理?

foldLeft的简单示例,例如:

val sum = prices.foldLeft(0.0)(_ + _)

是可以理解的,但是我不确定在有条件的情况下如何使用foldLeft。在这个问题中,我发布了一个字符匹配的条件。

scala
1个回答
0
投票

此代码中有几个错误:

  • 您尚未关闭Lambda的括号
  • 您在...井字串上使用List模式匹配,因为
  • [x这是到目前为止的结果(因此最初是"",而y是数据(字符)的元素]

此代码应如下所示:

val data : String = "\' this is a test \\ "

data.toCharArray.foldLeft("") { (result, ch) =>
  if (ch == '\'' || ch == '\\') result
  else result + ch
}

0
投票

这里有几个问题,首先是一些语法问题,例如缺少条件句的括号。第一个真正的实质性问题是,初始值(""中的foldLeft(""))必须与累加器相同,并且必须与返回类型相同。您似乎希望将List[Char]作为返回类型,因此您需要使用List.empty[Char]这样的初始值。

接下来,我强​​烈建议使用accc之类的名称代替xy,以便更清楚地指示哪个是累加器,哪个是当前值。

另一个问题是''也是无效的Scala语法-没有空字符文字。仅出于示例目的,我将使用'_'作为替代。

有效的实现可能看起来像这样:

val data: String = "\' this is a test \\ "

data.toCharArray.foldLeft(List.empty[Char]) { (acc, c) =>
  c match {
    case '\'' => acc :+ '_'
    case '\\' => acc :+ '_'
    case other => acc :+ other
  }
}

哪个产量:

val data: String = "' this is a test \ "
val res1: List[Char] = List(_,  , t, h, i, s,  , i, s,  , a,  , t, e, s, t,  , _,  )

我认为您的目标是什么?

作为一个脚注,我假设这只是一种练习,但值得注意的是,对这种操作使用左折操作效率极低,因为您是通过追加来建立列表的。

© www.soinside.com 2019 - 2024. All rights reserved.