38 - Expresiones lambda con arreglos IntArray, FloatArray, DoubleArray etc.

Vimos en conceptos anteriores que para los tipos básicos Byte, Short, Int, Long, Float, Double, Char y Boolean tenemos una serie de clases para definir arreglos de dichos tipos: ByteArray, ShortArray, IntArray, LongArray, FloatArray, DoubleArray, CharArray y BooleanArray.

Vimos como crear por ejemplo un arreglo de 3 enteros y su posterior carga con la sintaxis:

    var arreglo = IntArray(3)
    arreglo[0] = 10
    arreglo[1] = 10
    arreglo[2] = 10    

La clase IntArray tiene una serie de métodos que requieren una expresión lambda, como no conocíamos las expresiones lambda no las utilizamos en los conceptos que vimos arreglos.

La clase IntArray como las otras que nombramos ( ByteArray, ShortArray, etc.) tienen un segundo constructor con dos parámetros, el primero indica la cantidad de elementos del arreglo y el segundo debe ser una expresión lambda que le indicamos el valor a almacenar en cada componente del arreglo:

    var arreglo = IntArray(10) {5}

Se crea un arreglo de 10 elementos y se almacena el número 5 en cada componente.

Si queremos almacenar en la primer componente un 0, en la segunda un 1 y así sucesivamente podemos disponer la siguiente sintaxis:

    var arreglo = IntArray(10) {it}

Esto funciona debido a que la función de orden superior cuando llama a nuestra expresión lambda para cada componente del arreglo nos envía la posición. Recordemos que de forma larga podemos expresarlo con la siguiente sintaxis:

    var arreglo = IntArray(10) {indice -> indice}

Si queremos guardar los valores 0,2,4,6 etc. podemos utilizar la sintaxis:

    var arreglo = IntArray(10) {it * 2}

Si queremos almacenar valores aleatorios comprendidos entre 1 y 6 podemos crear el objeto de la clase IntArray con la siguiente sintaxis:

    var arreglo = IntArray(10) {((Math.random() * 6) + 1).toInt()}

Problema 1

Crear un objeto de la clase IntArray de 20 elementos con valores aleatorios comprendidos entre 0 y 10.

Imprimir del arreglo:

  • Todos los elementos.
  • Cantidad de elementos menores o iguales a 5.
  • Mostrar un mensaje si todos los elementos son menores o iguales a 9.

  • Mostrar un mensaje si al menos uno de los elementos del arreglo almacena un 10.

Proyecto152 - Principal.kt

fun main(parametro: Array<String>) {
    var arreglo = IntArray(20) {(Math.random() * 11).toInt()}
    println("Listado completo del arreglo")
    for(elemento in arreglo)
        print("$elemento ")
    println()
    val cant1 = arreglo.count { it <= 5}
    println("Cantidad de elementos menores o iguales a 5: $cant1")
    if (arreglo.all {it <= 9})
        println("Todos los elementos son menores o iguales a 9")
    else
        println("No todos los elementos son menores o iguales a 9")
    if (arreglo.any {it == 10})
        println("Al menos uno de los elementos es un 10")
    else
        println("Todos los elementos son distintos a 10")
}

Para resolver estos algoritmos utilizamos una serie de métodos que nos provee la clase IntArray.

Definimos un objeto de la clase IntArray de 20 elementos y pasamos una expresión lambda para generar valores aleatorios comprendidos entre 0 y 10:

fun main(parametro: Array<String>) {
    var arreglo = IntArray(20) {(Math.random() * 11).toInt()}

Listado completo del arreglo:

    println("Listado completo del arreglo")
    for(elemento in arreglo)
        print("$elemento ")

Para contar la cantidad de elementos iguales al valor 5 la clase IntArray dispone un método llamado count que tiene un solo parámetro de tipo función:

    val cant1 = arreglo.count { it <= 5}

Cuando una función de orden superior tiene un solo parámetro como ocurre con count no es necesario disponer los paréntesis:

    val cant1 = arreglo.count() { it <= 5}

La forma más larga y poco empleada de codificar la expresión lambda con un único parámetro es:

val cant1 = arreglo.count({ valor -> valor <= 5})

Si queremos analizar si todos los elementos del arreglo cumplen una condición disponemos de la función all (retorna un Boolean):

    if (arreglo.all {it <= 9})
        println("Todos los elementos son menores o iguales a 9")
    else
        println("No todos los elementos son menores o iguales a 9")

Para verificar si alguno de los elementos cumplen una condición podemos utilizar el método any pasando la expresión lambda:

    if (arreglo.any {it == 10})
        println("Al menos uno de los elementos es un 10")
    else
        println("Todos los elementos son distintos a 10")

Siempre debemos consultar la página oficial de Kotlin donde se documentan todas las clases de la librería estándar, en nuestro caso deberíamos consultar la clase IntArray.

Problema propuesto

  • Crear un arreglo de tipo FloatArray de 10 elementos, cargar sus elementos por teclado.
    Imprimir la cantidad de valores ingresados menores a 50.
    Imprimir un mensaje si todos los valores son menores a 50.
Solución
Proyecto153

    fun main(parametro: Array<String>) {
    val arreglo = FloatArray(10)
    for(i in arreglo.indices) {
        print("Ingrese elemento:")
        arreglo[i] = readln().toFloat()
    }
    println("Listado completo del arreglo")
    for(elemento in arreglo)
        print("$elemento ")
    println()
    val cant = arreglo.count { it < 50}
    println("Cantidad de valores ingresados menores a 50: $cant")
    if (arreglo.all {it < 50})
        println("Todos los valores son menores a 50")
    else
        println("No todos los valores son menores a 50")
}