在Scala中,如果我有一个嵌套的for循环,我想在每个循环上执行不同的操作。
for (int i = 0; i<5; i++) {
System.out.println(i); //do something for just i
for(int j = 0; j<5; j++) {
System.out.println(i+j); //do something for both i and j
}
}
但是scala代码:
for {i<-0 to 5
j<- 0 to 5} yield { print(i); print(i+j)}
给出输出:
0
(0,0)
0
(0,1)
0
(0,2)
0
(0,3)
0
(0,4)
0
(0,5)
但我希望它是:
0
(0,0)
(0,1)
(0,2)
(0,3)
(0,4)
(0,5)
是否有办法只针对每个i
打印i
,并为 ONE i+j和i
打印j
> for loop?
答案 0 :(得分:3)
编译器将for
理解重写为其成分map()
,flatMap()
,foreach()
和withFilter()
部分。这就是为什么Scala语法的一些常规规则不适用于序列理解表达式的原因。他们在重写过程中受到了损害。
有一些技巧可以解决这个问题。
for {
i <- 0 to 5
_ = println(i)
j <- 0 to 5
} yield // do stuff with i and j
这实际上取决于您需要对i
值执行的操作。可能for
理解不是这项工作的最佳工具。
答案 1 :(得分:1)
我认为这会解决问题:
(0 to 5).zip(0 to 5).foreach{case (i, j) =>
//do stuff to i an dj
}
答案 2 :(得分:1)
执行相同操作的另一种方法是使用map
函数,如下所示
val loop = 0 to 5
loop.map(i => {
println(i) // do your stuffs as you did for i
loop.map(j => {
println(i, j) //do your stuffs as you did for i, j
})
})