我想在scala中编写一个for循环,但是在某些特殊情况下,计数器应该增加一个以上(数量是可变的)。
问问题
2537 次
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
}
因此,在循环的主体中,您可以根据自己的条件设置amountToSkip
为n 。将跳过 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,也可以直接定义它。但要小心:
- 您不再迭代 Range!
- 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 回答