В Kotlin я могу создать диапазон с обратным счетом? - PullRequest
31 голосов
/ 05 марта 2012

Я просмотрел документацию для диапазонов и не вижу упоминаний о обратных диапазонах.

Можно ли сделать что-то вроде:

for (n in 100..1) {
    println(n)
}

И получите результаты:

100
99
98
...

Ответы [ 6 ]

51 голосов
/ 29 сентября 2012

Используйте downTo как в:

for (n in 100 downTo 1) {
//
}
8 голосов
/ 05 марта 2012

Обратные диапазоны поддерживаются с использованием унарного оператора минус -, как в -(1..100).

Чтобы вызвать метод для этого диапазона, вам необходимо заключить его в скобки, как в (-(1..100)).foreach { println(it) }.

6 голосов
/ 20 июня 2017

Как указали другие, правильный ответ -

for (n in 100 downTo 1) {
    println(n)
}

Но почему команда Kotlin выбрала 100 downTo 1 против 100..1?

Я думаю, что синтаксис 100..1 будет плохим, если мы попытаемся использовать переменные вместо литералов. Если мы набрали

for (n in b..a)

тогда неясно, какой цикл мы хотим использовать.

Возможно, мы намеревались считать в обратном направлении, но если b окажется меньше, чем a, то наша программа будет фактически рассчитывать в сторону увеличения! Это будет источником ошибок.

4 голосов
/ 25 октября 2018

Так же, как пример универсальной функции диапазона для «для»:

private infix fun Int.toward(to: Int): IntProgression {
    val step = if (this > to) -1 else 1
    return IntProgression.fromClosedRange(this, to, step)
}

Использование:

// 0 to 100
for (i in 0 toward 100) {
    // Do things
}

// 100 downTo 0
for (i in 100 toward 0) {
    // Do things
}
1 голос
/ 05 марта 2012

Если вы посмотрите на страницу, на которую вы ссылались, есть предложение для функции reversed, которая позволила бы вам выполнить for (n in (1..100).reversed()), но, похоже, она еще не реализована.Оператор .. всегда считает до.

0 голосов
/ 27 августа 2018
(100 downto 1).map{ println(it) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...