减少Scala中的循环?

rwb*_*rwb 9 scala

第一天和第一次尝试使用Scala - 所以对我来说很容易!我正在尝试重写一些旧的Java代码,它只是一个函数,它接受两个数字并打印出从x到y的数字.例如,我有增量功能:

    def increment(start: Int, finish: Int) = {
      for (i <- start to finish) {
         println("Current value (increasing from "+start+" to "+finish+") is "+i)
      }
    }
Run Code Online (Sandbox Code Playgroud)

然而,我正在努力写一个相应的减量函数,从开始到结束将减少?我已经向下Scala或者循环减少了吗?但我仍然不确定

谢谢

dac*_*cwe 16

scala>def decrement(start: Int, finish: Int) = {
    |  for (i <- start to finish by -1)
    |   println("Current value (decreasing from "+start+" to "+finish+") is "+i);
    | }
decrement: (start: Int,finish: Int)Unit

scala> decrement(10, 1)
Current value (decreasing from 10 to 1) is 10
Current value (decreasing from 10 to 1) is 9
Current value (decreasing from 10 to 1) is 8
Current value (decreasing from 10 to 1) is 7
Current value (decreasing from 10 to 1) is 6
Current value (decreasing from 10 to 1) is 5
Current value (decreasing from 10 to 1) is 4
Current value (decreasing from 10 to 1) is 3
Current value (decreasing from 10 to 1) is 2
Current value (decreasing from 10 to 1) is 1
Run Code Online (Sandbox Code Playgroud)


use*_*own 6

for (i <- (6 to 3 by -1)) {println ("i: " + i)}
i: 6
i: 5
i: 4
i: 3
Run Code Online (Sandbox Code Playgroud)

如果你碰巧忘记了by -1,你可以向上移动并使用一个函数来恢复结果:

for (i <- (3 to 6)) {println ("i: " + ((6+3) - i))}
Run Code Online (Sandbox Code Playgroud)

要排除第二个边界,请使用until

for (i <- (6 until 3 by -1)) {println ("i: " + i)}
i: 6
i: 5
i: 4
Run Code Online (Sandbox Code Playgroud)

或者,您可以为您的目的定义一个迭代器。扩展迭代器很容易;只需实现 'hasNext:Boolean' 和 'Next:[T]',其中 T 是要处理的类型 - 在我们的例子中是 Int 或者 Long 或 BigInt:

class FromToIterator (start: Int, stop: Int) extends Iterator [Int] { 
  var current = start
  //                        3       6       3         6         6       3       6         3
  def hasNext : Boolean = ((start < stop && current <= stop) || (start > stop && current >= stop)) 
  def next: Int = { 
    val res = current
    if (start < stop) current += 1 else current -= 1
    res
  } 
}
val it = new FromToIterator (3, 6)
val ti = new FromToIterator (6, 3)

for (i <-it) println (i)
for (i <-ti) println (i)
Run Code Online (Sandbox Code Playgroud)