1

我想在scala中编写一个for循环,但是在某些特殊情况下,计数器应该增加一个以上(数量是可变的)。

4

3 回答 3

0

您可以结合使用过滤器和外部变量来做到这一点。这是一个例子:

var nextValidVal = 0
for (i <- 0 to 99; if i >= nextValidVal) {
  var amountToSkip = 0
  // Whatever this loop is for
  nextValidVal = if (amountToSkip > 0) i + amountToSkip + 1 else nextValidVal
}

因此,在循环的主体中,您可以根据自己的条件设置amountToSkipn 。将跳过 i 序列的下n 个值。

如果您的序列是从其他类型的序列中提取的,您可以这样做

var skip = 0
for (o <- someCollection if { val res = skip == 0; skip = if (!res) skip - 1 else 0; res } ) {
  // Do stuff
}

如果skip在循环体中设置为正值,则将跳过序列的下n 个元素。

当然,这是非常必要和副作用的。我会尽可能地寻找其他方法,通过映射或过滤或折叠原始序列。

于 2013-09-11T12:36:30.663 回答
0

您可以实现自己的流来反映步骤,例如:

import scala.collection.immutable.Stream
import ForStream._
object Test {
  def main(args: Array[String]): Unit = {
    val range = 0 to 20 by 1 withVariableStep; // in case you like definition through range
    //val range = ForStream(0,20,1) // direct definition
    for (i<- range) {
      println(s"i=$i")
      range.step = range.step + 1
    }
  }
}

object ForStream{
  implicit def toForStream(range: Range): ForStream = new ForStreamMaster(range.start, range.end,range.step)
  def apply(head:Int, end:Int, step:Int) = new ForStreamMaster(head, end,step)
}

abstract class ForStream(override val head: Int, val end: Int, var step: Int) extends Stream[Int] {
  override val tailDefined = false
  override val isEmpty = head > end
  def withVariableStep = this
}

class ForStreamMaster(_head: Int, _end: Int, _Step: Int) extends ForStream(_head, _end,_Step){
  override def tail = if (isEmpty) Stream.Empty else new ForStreamSlave(head + step, end, step, this)
}

class ForStreamSlave(_head: Int, _end: Int, _step: Int, val master: ForStream) extends ForStream(_head, _end,_step){
  override def tail = if (isEmpty) Stream.Empty else new ForStreamSlave(head + master.step, end, master.step, master)
}

这打印:

我=0

我=2

我=5

我=9

我=14

我=20

您可以使用隐式从 Range 定义 ForStream,也可以直接定义它。但要小心:

  1. 您不再迭代 Range!
  2. Stream 应该是不可变的,但 step 是可变的!

同样正如@om-nom-nom 所指出的,这可能通过递归更好地实现

于 2013-09-11T14:10:48.443 回答
0

为什么不使用 do-while 循环?

var x = 0;
do{
...something
if(condition){change x to something else}
else{something else}
x+=1
}while(some condition for x)
于 2015-10-17T23:03:44.930 回答