Цикл вверх и вниз - PullRequest
       4

Цикл вверх и вниз

0 голосов
/ 10 июня 2018

У меня есть следующий код

(0..6).forEach { colorized(colors, it) }
(6 downTo 0).forEach { colorized(colors, it) }

Где я зацикливаюсь вверх и вниз.Есть ли способ добиться этого за один цикл вместо двух?

Ответы [ 4 ]

0 голосов
/ 10 июня 2018

Вы можете попытаться добавить два диапазона как один:

((0..6) <a href="https://github.com/JetBrains/kotlin/blob/79487a6a21bdd4147a542e4cb2c7715e5efc96de/libraries/stdlib/common/src/generated/_Collections.kt#L1955" rel="nofollow noreferrer">+</a> (6 downTo 0)).forEach { colorized(colors, it) }

или попытаться уменьшить количество параметров:

with (6) { (0..this) <a href="https://github.com/JetBrains/kotlin/blob/79487a6a21bdd4147a542e4cb2c7715e5efc96de/libraries/stdlib/common/src/generated/_Collections.kt#L1955" rel="nofollow noreferrer">+</a> (this downTo 0) }.forEach { colorized(colors, it) }

0 голосов
/ 10 июня 2018

Это простой, но уродливый способ сделать это за один цикл:

inline fun<T> Iterable<T>.forEachUpDown(action: (T) -> Unit): Unit {
    for (index in 0 until this.count()) {
        action(this.elementAt(index))
        action(this.elementAt(this.count()-index-1))
    }
}

и вызов:

(0..6).forEachUpDown {
        colorized(colors,it)
    }

, поскольку (0..6) является итеративным, он может быть только пройден, и элементы не могут быть доступны по индексу.

Более эффективный способ сделать это всего за один цикл - это:

 val max=6
    for (index in 0 until max) {
        colorized(colors, index)
        colorized(colors, max-index-1)
    }

, но, лично я думаю, ваш путь понятнее.

0 голосов
/ 10 июня 2018

Простое расширение на IntRange может решить это:

fun IntRange.forEachUpAndDown(action: (Int) -> Unit) {
    forEach(action)
    reversed().forEach(action)
}

fun main(args: Array<String>) {
    (0..6).forEachUpAndDown {
        println(it)
    }
}
0 голосов
/ 10 июня 2018

Это будет делать:

(0..13).forEach { colorized(colors, if (it > 6)  13 - it else it) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...