94

我查看了 Ranges 的文档,但没有提到向后的范围。

是否可以执行以下操作:

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

并得到结果:

100
99
98
...
4

5 回答 5

161

使用 downTo 如下:

for (n in 100 downTo 1) {
//
}
于 2012-09-28T20:26:05.437 回答
19

就像“for”的通用范围函数的示例:

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
}
于 2018-10-25T09:36:59.040 回答
18

正如其他人指出的那样,正确答案是

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

但是 Kotlin 团队为什么选择100 downTo 1vs100..1呢?

我认为100..1当我们尝试使用变量而不是文字时,语法会很糟糕。如果我们输入

for (n in b..a)

那么就不清楚我们想要使用什么循环。

我们可能打算倒数,但如果b结果小于a,那么我们的程序实际上会向上计数!那将是错误的来源。

于 2017-06-20T05:48:08.427 回答
12

-使用负一元运算符支持反转范围,如-(1..100).

要在该范围内调用方法,您需要用括号将其括起来,如

(-(1..100)).foreach { println(it) }
于 2012-03-05T09:04:00.350 回答
3
(100 downto 1).map{ println(it) }
于 2018-08-27T14:44:09.410 回答