Press "Enter" to skip to content

Bucles, Loops y Estructuras Iterativas en Kotlin para proyectos Android (Tutorial 8)


Bucle FOR

Al utilizar el bucle FOR en una aplicación, lograremos que la ejecución de un determinado código se repita tantas veces como elementos haya en un rango o conjunto de elementos que le indiquemos.

La sintaxis del bucle FOR es la siguiente:

for (variable in rango) {

   // Código a ejecutar

}

El apartado donde se especifica el rango de elementos que debe analizar puede variar su sintaxis dependiendo del tipo de rango que le indiquemos. Por ejemplo, si queremos analizar un rango de valores numéricos, la sintaxis del bucle FOR podría ser similar a esta:

for (i in 1..10) {

   // Código a ejecutar

}

Con este bucle, la primera repetición analizará el número 1 y lo guardará en la variable «i», en la segunda repetición analizará el número 2 y así sucesivamente hasta llegar al final del rango de valores, que en este caso es el número 10.

Podemos colocar cualquier código entre las llaves del bucle FOR, y este se ejecutará cada vez que analice un número. Por ejemplo, si tenemos este TextView

<TextView
    android:id="@+id/mytextview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Texto de ejemplo" />

y colocamos colocamos el siguiente código entre las llaves del bucle:

var tViewTest:TextView = findViewById(R.id.mytextview)
for (i in 1..10) {

 tViewTest.text = tViewTest.text.toString() + i.toString()

}

Cada vez que analice un número, se mostrara en el textview el número que tenga la variable «i» en esa repetición.

Cuando trabajamos con rango de valores numéricos en el bucle FOR, podemos forzar al bucle para que no analice dicho rango de forma secuencial con la palabra reservada STEP. Con esta instrucción, podemos indicarle al bucle que salte en el rango de valores indicado con una cantidad de números en cada repetición. Por ejemplo:

for (i in 1..10 step 2) {

   // Código a ejecutar

}

Con esta modificación, el bucle analizará el rango de números desde el 1 hasta el 10, saltando dos números en cada repetición.

En cambio, si queremos que el bucle analice un rango de valores numéricos empezando por el número más grande y que termine por el número más pequeño, deberemos utilizar la palabra reservada DOWNTO, de esta forma:

for (i in 10 downTo 3) {

   // Código a ejecutar

}

de forma que, el bucle empezara a analizar el rango desde el número más grande, que es el 10, y se parara en el número 3, porque coincide con el indicado en la instrucción DOWNTO.

Si queremos, podemos combinar esta instrucción con STEP de esta forma:

for (i in 10 downTo 3 step 2) {

   // Código a ejecutar

}

Otra cosa que podemos hacer con este rango de valores numéricos es indicarle al bucle que no analice el último número del rango. Por ejemplo, si queremos que el bucle analice los números del 1 al 9, de una secuencia de 10 números , podemos escribir lo siguiente:

for (i in 1 until 10) {

  // código a ejecutar

}

Esta instrucción tambien se puede combinar con STEP de esta forma:

for (i in 1 until 10 step 2) {

  // código a ejecutar

}

Además de trabajar con valores numéricos, el bucle FOR en Kotlin también puede analizar los elementos de un array. Por ejemplo, si tenemos un array y queremos mostrar los elementos en un textView como este:

<TextView android:id="@+id/mytextview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Texto de ejemplo" />

podemos escribir lo siguiente:

//creación del array
val animales = arrayOf("perro","gato","pajaro")
var tViewTest:TextView = findViewById(R.id.mytextview)

for (i in animales) {

  tViewTest.text = tViewTest.text.toString() + i.toString()+", "

}

Podemos incluso trabajar con los índices de cada posición del array utilizando la función INDICES de la siguiente manera:

//creación del array
val animales = arrayOf("perro","gato","pajaro")
var tViewTest:TextView = findViewById(R.id.mytextview)

for (i in animales.indices) {

  tViewTest.text = tViewTest.text.toString() + "El animal en la posición"
  + i.toString() + "es "+ animales[i] + ", "

}

Gracias a que podemos obtener la cantidad de elementos que tiene un array con la función SIZE, podemos utilizar esta cantidad de elementos para crear un rango de valores numéricos de la siguiente forma:

//creación del array
val animales = arrayOf("perro","gato","pajaro")

for (i in 0.. animales.size-1) {
  // código a ejecutar
}

Además, también es posible utilizar este bucle para recorrer los elementos de una colección de datos, como por ejemplo un ArrayList, y que en cada repetición se analice cada uno de sus elementos. Por ejemplo, si tenemos este TextView:

<TextView android:id="@+id/mytextview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Texto de ejemplo" />

Este bucle se podria escribir de la siguiente manera:

//creación de la colección de datos
var listaNumeros = mutableListOf<Int>(1,2,3)
var tViewTest:TextView = findViewById(R.id.mytextview)

for (i in listaNumeros) {
  
   tViewTest.text = tViewTest.text.toString() + i.toString() + ", "
  
}

También es posible utilizar este mismo tipo de bucle para recorrer los caracteres de una cadena de texto, ya que los datos de tipo String se consideran arrays formados por elementos de tipo Char. En este caso, el bucle se puede escribir de la siguiente manera:

var tViewTest:TextView = findViewById(R.id.mytextview)

for (i in "hola") {
  
   tViewTest.text = tViewTest.text.toString() + i.toString() + ", "
  
}

Si se desea, se puede utilizar este bucle para dividir una cadena de texto en trozos más pequeños y trabajar con ellos individualmente.

Además, si en el interior de un bucle FOR solo hubiese una linea de codigo, es posible simplificar la estructura de este bucle de esta forma:

var tViewTest:TextView = findViewById(R.id.mytextview)

for (i in 0 ..10) tViewTest.text = tViewTest.text.toString() + i.toString() + ", "

Pero si dentro de la estructura FOR hubiera más de una línea de código, este bucle se podría simplificar en una única línea, utilizando los caracteres llave y el carácter punto y coma como separador de líneas, como se muestra a continuación:

var tViewTest:TextView = findViewById(R.id.mytextview)
var varTexto=""

for (i in 0..10) {varTexto =varTexto + i.toString(); varTexto = varTexto + ", " }

tViewTest.text = varTexto

Bucle WHILE

El bucle WHILE es una estructura que se utiliza para repetir un bloque de código mientras se cumpla una condición determinada.

La sintaxis del bucle WHILE es la siguiente:

while (condición) {

    // bloque de código a repetir mientras la condición sea verdadera

}

La sintaxis de este bucle consiste en utilizar una condición que se evalúa en cada repetición. Donde si la condición se cumple, el código dentro del bucle se ejecuta, y una vez finalizada la ejecución de este código, se vuelve a evaluar la condición, y si sigue siendo verdadera, el código se ejecuta nuevamente. Este proceso continúa hasta que la condición deja de ser verdadera.

Veamos un ejemplo práctico:

Si tenemos este TextView

<TextView android:id="@+id/mytextview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Texto de ejemplo" />

y queremos ejecutar un bloque de código mientras una variable «contador» sea inferior a 10, incrementando el valor de esta variable en una unidad en cada repetición, mostrando el resultado en el TextView, podemos hacerlo de la siguiente manera:

var tViewTest:TextView = findViewById(R.id.mytextview)
var contador = 0

while (contador < 10) {
    tViewTest.text = tViewTest.text.toString() +contador.toString()+", "
    contador++
}

En este ejemplo, el bucle se repetirá hasta que el valor de «contador» sea igual a 10, momento en el que la condición ya no se cumple y el bucle deja de ejecutarse.

Es importante destacar que la estructura WHILE se puede simplificar en una sola línea, si en el interior del bucle solo hubiese una linea de código, de esta forma :

while (contador < 10) tViewTest.text = tViewTest.text.toString() +contador.toString()+", "

O si en su interior hubiera más de una línea de código, se podría simplificar utilizando los caracteres llaves y el signo de punto y coma.

var tViewTest:TextView = findViewById(R.id.mytextview)
var varTexto=""

while (contador < 10){varTexto =varTexto + contador.toString()+ ", " ; contador++ }

tViewTest.text = varTexto

Bucle DO-WHILE

El lenguaje de programación Kotlin cuenta con otra repetitiva llamada DO-WHILE, que tiene un funcionamiento similar al bucle WHILE, pero con algunas diferencias importantes. La sintaxis de esta estructura es similar a la siguiente:

do {

    // código a ejecutar

} while (condición)

En la estrcutra DO-WHILE, el código que se encuentra dentro del bucle se ejecuta primero y luego se verifica si se cumple o no la condición indicada. Si la condición se cumple, el código se vuelve a ejecutar y la condición se verifica nuevamente. Este proceso continúa hasta que la condición ya no se cumpla.

Esto significa que , el bucle DO-WHILE es una estructura útil cuando se necesita ejecutar el código dentro del bucle al menos una vez, incluso si la condición no se cumple de inmediato.

Por ejemplo si tenemos este TextView,

<TextView android:id="@+id/mytextview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Texto de ejemplo" />

y queremos crear un bucle que muestre el número que se encuentra en una variable «contador» en cada repetición, mientras que el valor de la variable sea inferior a 10, lo haríamos de la siguiente manera:

var tViewTest:TextView = findViewById(R.id.mytextview)
var contador = 0
do {

    tViewTest.text(contador.toString())
    contador++

} while (contador < 10)

Al igual que con otros bucles , si la estructura DO-WHILE tiene una única línea de codigo en su interior, se puede simplificar de la siguiente manera:

var tViewTest: TextView = findViewById(R.id.mytextview)
var contador = 0

do contador=contador+3 while (contador < 10)
       
tViewTest.text=contador.toString()

En cambio, si tiene más de una línea de código, se deberá utilizar los caracteres llave y el carácter punto y coma como separador de líneas:

var tViewTest: TextView = findViewById(R.id.mytextview)
var contador = 0

do { tViewTest.text=contador.toString(); contador++} while (contador < 10)

Diferencias entre WHILE Y DO-WHILE

Los bucles WHILE y DO-WHILE son estructuras que permiten repetir una serie de instrucciones mientras se cumpla una condición específica. Aunque simple vista bucles pueden parecer similares, la principal diferencia entre WHILE y DO-WHILE radica en el orden en que se ejecutan las instrucciones.

Porque mientras que el bucle WHILE primero comprueba la condición y luego ejecuta el código de su interior si se cumple dicha condición, el bucle DO-WHILE hace lo contrario: primero ejecuta el código de su interior y luego comprueba la condición.

La implicación de esta diferencia es que la estructura DO-WHILE siempre ejecutará el código de su interior al menos una vez, independientemente de si se cumple o no la condición. Por otro lado, el bucle WHILE puede que nunca llegue a ejecutar el código de su interior si la condición nunca se cumple.

Anidando Bucles con otras estructuras

En Kotlin, al igual que en otros lenguajes, podemos anidar bucles dentro de otros bucles, así como estructuras condicionales dentro de bucles o bucles dentro de estructuras condicionales.

Sin embargo, es importante tener cuidado al anidar bucles, porque pueden consumir muchos recursos si no se codifican correctamente, lo que puede llevar a problemas de rendimiento y errores en el programa. Por ejemplo, si tenemos tres bucles anidados y cada uno se ejecuta 100 veces, se realizarán 1 millón de repeticiones en total. Si estos bucles no están optimizados, la ejecución del programa podría ser extremadamente lenta.

Además, cada nivel de anidamiento puede afectar significativamente el rendimiento del programa, por lo que es importante limitar el número de bucles anidados en la medida de lo posible.

Interrumpir la ejecución de un bucle con BREAK y CONTINUE

En Kotlin, hay dos instrucciones que podemos usar para interrumpir la ejecución de un bucle de forma repentina: BREAK y CONTINUE.

Con BREAK, podemos detener por completo la ejecución de un bucle y continuar ejecutando el código que está después de este bucle. Por ejemplo, si queremos detener un bucle WHILE en su quinta repetición, podemos utilizar la instrucción BREAK para interrumpir su ejecución en ese momento.

Por ejemplo, si tenemos este TextView:

<TextView android:id="@+id/mytextview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Texto de ejemplo" />

si ejecutamos este bucle FOR :

var tViewTest: TextView = findViewById(R.id.mytextview)
for (contador in 1..10) {
    if (contador == 5) {
        break
    }
    tViewTest.text = tViewTest.text.toString() +contador.toString()+", "
}
tViewTest.text = tViewTest.text.toString() +"El bucle ha terminado"

El bucle se detendra en la repetición en la que la variable contador es igual a 5, y después continúara con el resto del código.

Por otro lado, la instrucción CONTINUE interrumpe la ejecución de un bucle, pero solo en la repetición que se está ejecutando actualmente. En lugar de detener por completo la ejecución del bucle, CONTINUE obliga al bucle a realizar otra repetición. Por ejemplo, si queremos omitir la ejecución del código de la quinta repetición de un bucle WHILE, podemos utilizar la instrucción CONTINUE para saltar a la siguiente repetición.

Por ejemplo, si tenemos este TextView:

<TextView android:id="@+id/mytextview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Texto de ejemplo" />

si ejecutamos este bucle FOR :

var tViewTest: TextView = findViewById(R.id.mytextview)
for (i in 1..10) {
    if (i == 5) {
        continue
    }
    tViewTest.text = tViewTest.text.toString() +contador.toString()+", "
}
tViewTest.text = tViewTest.text.toString() +"El bucle ha terminado"

El mensaje correspondiente a la repetición en la que la variable contador es igual a 5 no se imprimira, y después el bucle continúara con el resto de las repeticiones y el código que hay después del bucle.

Es importante tener en cuenta que estas instrucciones pueden ser muy útiles en ciertas situaciones, pero deben ser utilizadas con precaución, ya que su uso excesivo o inadecuado puede conducir a problemas de rendimiento y errores en el código.

Video explicativo Bucles Kotlin para Android

Si queréis, podeis ver una explicación mas detalla en este video: