Int.until în Kotlin

Intervale și conversii de numere Kotlin 1.0 (..<: 1.9)

Construiesc șiruri de numere pentru bucle: until fără capătul de sus, downTo descrescător, step cu pas.

Sintaxă
infix fun Int.until(to: Int): IntRange
infix fun Int.downTo(to: Int): IntProgression
infix fun IntProgression.step(step: Int): IntProgression

Ce face Int.until

0 until 5 înseamnă 0, 1, 2, 3, 4: capătul de sus este exclus. Este potrivit pentru indici: for (i in 0 until lista.size). Din Kotlin 1.9 aceeași formă se scrie și 0..<5. Spre comparație, 0..5 include și 5.

10 downTo 1 numără descrescător, de la 10 la 1, ambele incluse. step schimbă pasul: 0..20 step 5 dă 0, 5, 10, 15, 20, iar 10 downTo 0 step 3 dă 10, 7, 4, 1. Pasul trebuie să fie pozitiv, chiar și cu downTo.

Toate sunt funcții infix, deci se scriu între numere, fără punct și paranteze. Rezultatul poate fi folosit în for sau transformat cu toList(), map, sum.

Parametri

Parametru Descriere
to Capătul șirului (exclus la until, inclus la downTo).
step Pasul, un număr pozitiv.

Ce returnează

Un IntRange sau IntProgression.

Exemple

Exemplul 1: until, downTo și step

toList() arată ce numere conține fiecare șir.

fun main() {
    println((0 until 5).toList())
    println((0..<5).toList())
    println((5 downTo 1).toList())
    println((0..20 step 5).toList())
    println((10 downTo 0 step 3).toList())
}

Rezultat

[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
[5, 4, 3, 2, 1]
[0, 5, 10, 15, 20]
[10, 7, 4, 1]

Exemplul 2: Indici pentru o listă

until lista.size nu iese niciodată din listă.

fun main() {
    val orase = listOf("Iași", "Cluj", "Sibiu")
    for (i in 0 until orase.size) {
        println("$i: ${orase[i]}")
    }
}

Rezultat

0: Iași
1: Cluj
2: Sibiu

Exemplul 3: Numere pare în ordine inversă

Combinăm downTo cu step 2 și calculăm suma.

fun main() {
    val pare = 20 downTo 2 step 2
    println(pare.joinToString(" "))
    println("Suma: ${pare.sum()}")
}

Rezultat

20 18 16 14 12 10 8 6 4 2
Suma: 110

Greșeli frecvente

  • Scrii for (i in 10..1) și bucla nu rulează deloc: .. numără doar crescător. Folosește 10 downTo 1.
  • Folosești 0..lista.size pentru indici și ultimul pas aruncă IndexOutOfBoundsException. Folosește until sau lista.indices.
  • Scrii 10 downTo 0 step -2. Pasul trebuie să fie pozitiv; direcția o dă downTo.

Comenzi înrudite

  • IntRange.contains: Lucrul cu un interval a..b: in verifică apartenența, first și last dau capetele, reversed îl inversează.
  • Range-uri (.., ..<, until, downTo, step): Intervale de numere sau caractere: .. include capătul, ..< și until îl exclud, downTo numără invers, step sare.
  • for: Parcurge pe rând elementele unei colecții, ale unui interval sau ale oricărui obiect care are iterator().
  • repeat: Rulează un bloc de cod de un anumit număr de ori; în bloc, it este numărul repetării, de la 0.