Для цикла с многовариантным в Котлине - PullRequest
0 голосов
/ 16 ноября 2018

Как я могу сделать этот код Java в Kotlin, используя только один для цикла?

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

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

ответ 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
}

Это менее эффективно (изначально создавая итерации, диапазоны и последовательности, а затем пару для каждой итерации).Но это точный эквивалент кода в вопросе.И поскольку он определяет каждый диапазон в одном месте, он, по крайней мере, делает их очень ясными.

(я думаю, что для этого нужен Kotlin 1.3. Возможно, существуют более простые и / или более общие способы сделать это; не стесняйтесьотредактируйте это, если вы можете улучшить это!)

0 голосов
/ 16 ноября 2018

Нет способа перебрать несколько переменных.В этом случае самое простое, что вы можете сделать:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...