Rangos En Kotlin

En este tutorial aprenderás sobre el uso de Rangos en Kotlin para iterar sobre subconjuntos de elementos. A lo largo del contenido verás que es un rango, como crearlos, el uso de funciones para alterar recorridos en bucles for.

Crear Rangos En Kotlin

Un rango es la representación del concepto matemático de intervalo de valores. Es decir, es un subconjunto de elementos comprendidos entre un extremo inferior a y un extremo superior b.

Por ejemplo, el rango [0,5] representa los valores enteros del 0 al 5. Para crearlo en Kotlin usas la función operador toRange() desde el extremo inferior y pasas como argumento el extremo superior:

fun main() {
    val fromZeroToFive = 0.rangeTo(5)
    println(fromZeroToFive) // 0..5
}

Sin embargo, es mucho más legible si usas la forma de construcción semántica con dos puntos seguidos (a..b) para reemplazar a toRange().

println(0..5) // 0..5

Si quieres determinar si un elemento se encuentra dentro de un rango usa el operador in.

fun main() {    
    println(5 in 1..10) // true
    println(',' in 'a'..'z') // false

    fun isInDomain(value: Double): Boolean {
        val lowerEndpoint = -2.0..0.0
        val upperEndpoint = 0.5..1.0
        return value in lowerEndpoint
                && value in upperEndpoint
    }

    println(isInDomain(0.4)) // false
}

La Interfaz CloseRanged

El diseño para los rangos se establece en la interfaz CloseRanged<T>. Este tipo modela intervalos cerrados, es decir, los extremos se incluyen como parte del subconjunto.

interface ClosedRange<T : Comparable<T>>

Dichos extremos son representados por las propiedades start y endInclusive.

Existen clases que representan rangos para los tipos básicos como IntRange, LongRange, CharRange y ClosedFloatPointRange. Cada uno de ellos implementa a CloseRanged.

1..100      // [1,100] IntRange
1L..99L     // [1,99] LongRange
'a'..'z'    // ['a','z'] CharRange
0.5..1.2    // [0.5, 1.2] ClosedFloatingPointRange

Sin embargo ya que rangeTo() es una función de extensión de Comparable, puedes crear un rango a partir de las clases que implementen ese tipo, como algunas de la librería estándar o las tuyas propias.

"Carla".."Sebastián" // ClosedRanged<String>

En el ejemplo anterior creamos un rango de strings porque String implementa a Comparable. Esto permite usar su lógica de comparación para determinar la existencia de un valor entre ambos.

En este caso sería en el ordenamiento alfabético el ítem se encuentra después que "Carla" y antes que "Sebastián". Por ejemplo, "Pedro" pertenecería al rango ya que coincide con esta condición.

fun main() {
    val clients = "Carla".."Sebastián"
    print("Pedro" in clients) // true
}

Usar Rangos En Bucle for

Es posible iterar a través de un rango en el bucle for al escribir la comprobación con in en su sintaxis.

Por ejemplo, si necesitamos imprimir el rango de la función f(x)= x2+2x-1 con el dominio [1, 10]:

fun main() {
    for (i in 1..10) {
        println(i * i + 2 * i - 1)
    }
}

Salida:

2
7
14
23
34
47
62
79
98
119

La Función step()

Retorna una progresión con en el mismo rango para ser recorrido con en el incremento pasado como argumento.

Por ejemplo, si desearas iterar de 2 en 2 en el rango 1..10 usarías step así:

fun main() {
    for(i in 1..10 step 2){
        print(i) // 13579
    }
}

Se imprimen los números desde el 1 y los elementos subsecuentes cuya diferencia sea 2.

La Función until()

Si deseas crear un rango semiabierto que excluya el límite superior, crealo usando la función until desde el límite inferior y pasando como argumento al extremo derecho.

Por ejemplo, creemos el rango [0,5):

fun main() {
    for(i in 0 until 5){
        print(i) // 01234
    }
}

Esto excluirá la iteración del número 5 del bucle for.

La Función downTo()

Te permite crear una progresión que sea recorrida desde el extremo superior hacia el extremo inferior.

Por ejemplo, iterar en orden inverso el rango [20,30]:


fun main() {
    for(i in 30 downTo 20){
        println(i)
    }
}

Salida:

30
29
28
27
26
25
24
23
22
21
20

Únete Al Discord De Develou

Si tienes problemas con el código de este tutorial, preguntas, recomendaciones o solo deseas discutir sobre desarrollo Android conmigo y otros desarrolladores, únete a la comunidad de Discord de Develou y siéntete libre de participar como gustes. ¡Te espero!