Scala:以功能方式迭代和累积时避免var(无var)

发布于 2025-02-06 13:34:35 字数 333 浏览 2 评论 0原文

我需要帮助才能找到正确的Scala方法,这将使该代码更具功能性和不可变化。

  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
  }

I need help to find the right Scala approach that will make this code more functional and less mutable.

  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
  }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

吃→可爱长大的 2025-02-13 13:34:37

foldleft是一种方法,当逻辑简单明了时,很有用。但是通常,在Scala中,这种任务的首选工具是(尾部)递归:

`

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

foldLeft is one way, useful when logic is simple and concise. But in general the go-to tool for this kind of tasks in scala is (tail) recursion:

`

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)
}
无风消散 2025-02-13 13:34:37

这是使用foldleft的解决方案。我们将两个变量存储在每个字符(mytimemintime)之后,我们需要修改,将其存储在元组中。

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
}

Here's a solution using foldLeft. We store the two variables we need to modify after each character (myTime and minTime) in a tuple as the accumulator.

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
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文