Как кодировать «для кортежа в нескольких диапазонах»? - PullRequest
0 голосов
/ 05 ноября 2019

Например:

for ((x, y) in (1..100, 50 downTo 0)) {}
for ((x, y, z) in (1..100, 50 downTo 0, 500..1000 step 2)) {}

Я нашел официальный документ kotlin: Объявления уничтожения , но все еще не могу написать правильный код.

1 Ответ

1 голос
/ 05 ноября 2019

Вы можете создать функцию zipOf, которая возвращает Sequence всех возможных комбинаций. Вот 3 перегрузки этой функции:

fun <T1, T2> zipOf(first: Iterable<T1>, second: Iterable<T2>) = sequence {
    for (t1 in first)
        for (t2 in second)
            yield(t1 to t2)
}

fun <T1, T2, T3> zipOf(first: Iterable<T1>, second: Iterable<T2>, third: Iterable<T3>) = sequence {
    for (t1 in first)
        for (t2 in second)
            for (t3 in third)
                yield(Triple(t1, t2, t3))
}

fun <T> zipOf(vararg iterables: Iterable<T>): Sequence<List<T>> =
    iterables.fold(sequenceOf(emptyList())) { result, iterable ->
        result.flatMap { list -> iterable.asSequence().map { elm -> list + elm } }
    }

Вы можете использовать их следующим образом:

for ((x, y) in zipOf(1..100, 50 downTo 0)) {}
for ((x, y, z) in zipOf(1..100, 50 downTo 0, 500..1000 step 2)) {}
for ((x, y, z, w) in zipOf(1..100, 50 downTo 0, 500..1000 step 2, 0..1)) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...