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 1vsを選んだの100..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 に答える