在Kotlin中使用多变量进行循环

时间:2018-11-16 14:39:08

标签: kotlin

如何仅使用一个for循环在kotlin中执行此Java代码?

for(int i=0, j=0; i < 6 && j < 6; i++, j+=2) {
    // code here
}

3 个答案:

答案 0 :(得分:7)

没有办法遍历多个变量。在这种情况下,最简单的操作是:

for (i in 0..3) {
    val j = i * 2
}

在更一般的情况下,您可以将其重写为while循环:

var i = 0
var j = 0
while (i < 6 && j < 6) {
    // code here
    i++
    j += 2
}

答案 1 :(得分:0)

yole的答案几乎肯定是最简单,最有效的方法。

但是您可能会看到的另一种方法是将序列压缩在一起,例如:

for ((i, j) in sequence{ yieldAll(0 until 6) }.zip(sequence{ yieldAll(0 until 6 step 2) })) {
    // code here
}

使用实用程序功能更具可读性,例如:

fun <T, U> seqs(it1: Iterable<T>, it2: Iterable<U>)
    = sequence{ yieldAll(it1) }.zip(sequence{ yieldAll(it2) })

for ((i, j) in seqs(0 until 6, 0 until 6 step 2)) {
    // code here
}

效率较低(最初创建Iterable,Range和Sequences,然后为每个迭代创建Pair)。但这与问题中的代码完全等效。并且由于它在一个地方定义了每个范围,因此至少使它们非常清晰。

(我认为这需要Kotlin 1.3。可能有更简单和/或更通用的方法;如果可以改进,请随时进行编辑!)

答案 2 :(得分:0)

我非常感谢gidds的回答

但是还有另一种简便的方法可以为两个变量

在循环中编写 for
for ( (i, j) in (0..6).zip(0..6 step 2)){
    println("values are: $i, $j")
}

以上代码按预期运行得很好

您还可以轻松地为三个变量在循环中编写 for 。请参见以下代码。

在这段代码中,我试图实现三个变量系列

// 1.2.3 + 2.3.4 + 3.4.5 + ... + n(n+1)(n+2)

fun main(args: Array<String>) {
    // taking int input from console
    val number: Int = readLine()!!.toInt()
    var sum: Int = 0

    // here second variable jPair becomes pair because of second nested zip
    for ( (i, jPair) in (1..number).zip((0..number + 1).zip(2..number + 2))) {
        println("values are: $i, ${jPair.first}, ${jPair.second}")

        sum += (i * jPair.first * jPair.second)
    }

    println("Series sum is: $sum")
}

现在,让我们实现四个用于循环的变量

在下面的代码中,我试图实现四个变量系列

// 1.3.5.7 + 3.5.7.9 + 5.7.9.11 + ... + n(n+2)(n+4)(n+6)

fun main(args: Array<String>) {
    // taking int input from console
    val number: Int = readLine()!!.toInt()
    var sum: Int = 0

    // here second variable iPair becomes pair because of first nested zip
    // here second variable jPair becomes pair because of second nested zip
    for ( (iPair, jPair) in ((1..number step 2).zip(3..number + 2 step 2)).zip((5..number + 4 step 2).zip(7..number + 6 step 2))) {
        println("values are: ${iPair.first}, ${iPair.second}, ${jPair.first}, ${jPair.second}")

        sum += (iPair.first * iPair.second * jPair.first * jPair.second)
    }

    println("Series sum is: $sum")
}

这样,我们可以轻松地为in循环实现多个变量。