首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scala:在以功能方式迭代和积累时避免使用var (没有var)

scala:在以功能方式迭代和积累时避免使用var (没有var)
EN

Stack Overflow用户
提问于 2022-06-11 19:02:50
回答 2查看 56关注 0票数 1

我需要帮助找到正确的Scala方法,使这段代码更实用,更不易变。

代码语言:javascript
复制
  def findMinTime(str: String, timeByCar: Int): Int = {
    var myTime = timeByCar
    var minTime = timeByCar
    str.reverse.foreach { l =>
      if (l == 'A') myTime += 3 else myTime -= 2
      if (myTime < minTime) minTime = myTime
    }
    minTime
  }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-11 20:35:06

这里有一个使用foldLeft的解决方案。我们将每个字符(myTimeminTime)后需要修改的两个变量作为累加器存储在一个元组中。

代码语言:javascript
复制
def findMinTime(str: String, timeByCar: Int): Int = {
  val (myTime, minTime) = str.reverse.foldLeft((timeByCar, timeByCar)) {
    case ((myTime, minTime), l) =>
      val newTime = if (l == 'A') myTime + 3 else myTime - 2
      (newTime, newTime min minTime)
  }
  minTime
}
票数 1
EN

Stack Overflow用户

发布于 2022-06-12 12:00:45

foldLeft是一种方法,当逻辑简单而简洁时,它很有用。但是,一般来说,scala中这类任务的入门工具是(尾)递归:

`

代码语言:javascript
复制
def findMinTime(str: String, timeByCar: Int) = {
  @tailrec
  def loop(str: List[Char], minTime: Int, myTime: Int): Int = str match {
     case Nil => minTime
     case 'A' :: tail => loop(tail, myTime+3, minTime min myTime+3)
     case _ :: tail => loop(tail, myTime -2, minTime min myTime-2)
  }
  loop(str.toList.reverse, timeByCar, timeByCar)
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72587150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档