Rangesのドキュメントを調べましたが、後方範囲についての言及はありません。
次のようなことは可能ですか?
for (n in 100..1) {
println(n)
}
そして結果を得る:
100
99
98
...
Rangesのドキュメントを調べましたが、後方範囲についての言及はありません。
次のようなことは可能ですか?
for (n in 100..1) {
println(n)
}
そして結果を得る:
100
99
98
...
次のようにdownToを使用します。
for (n in 100 downTo 1) {
//
}
「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
}
他の人が指摘しているように、正解は
for (n in 100 downTo 1) {
println(n)
}
しかし、なぜKotlinチームは100 downTo 1
vsを選んだの100..1
ですか?
100..1
リテラルの代わりに変数を使おうとすると、構文が悪くなると思います。入力した場合
for (n in b..a)
そうすると、どのループを使用したいかが明確になりません。
逆算するつもりだったかもしれませんが、それb
よりも小さいことが判明した場合a
、プログラムは実際には上向きにカウントします。それがバグの原因になります。
逆の範囲は、のようにマイナス-
単項演算子を使用してサポートされ-(1..100)
ます。
その範囲でメソッドを呼び出すには、次のようにかっこで囲む必要があります。
(-(1..100)).foreach { println(it) }
(100 downto 1).map{ println(it) }