web-dev-qa-db-ja.com

Kotlinで、逆方向にカウントする範囲を作成できますか?

範囲のドキュメント を見ましたが、後方範囲についての言及はありません。

次のようなことは可能ですか?

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

そして結果を得る:

100
99
98
...
43
jjnguy

次のようにdownToを使用します。

for (n in 100 downTo 1) {
//
}
75
Hadi Hariri

逆の範囲は、-(1..100)のようにマイナス-単項演算子を使用してサポートされます。

その範囲でメソッドを呼び出すには、(-(1..100)).foreach { println(it) }のようにメソッドを括弧で囲む必要があります。

9
Franck Rasolo

他の人が指摘しているように、正解は

_for (n in 100 downTo 1) {
    println(n)
}
_

しかし、Kotlinチームが_100 downTo 1_と_100..1_を選択したのはなぜですか?

リテラルの代わりに変数を使おうとすると、構文_100..1_は悪いと思います。入力した場合

for (n in b..a)

そうすると、どのループを使用したいかが明確になりません。

逆方向に数えるつもりだったかもしれませんが、baよりも小さいことが判明した場合、プログラムは実際には上向きに数えます。それがバグの原因になります。

7
Escape Velocity

「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
}
5
letner

リンクした正確なページを見ると、for (n in (1..100).reversed())を実行できるreversed関数の提案がありますが、まだ実装されていないようです。 ..演算子は常にカウントアップします。

2
hobbs
(100 downto 1).map{ println(it) }
0
CoolMind