En este tutorial aprenderás a usar la función average
en Kotlin con el fin de obtener el promedio de los elementos de una colección de números.
Función average()
La función de extensión average()
retorna la media aritmética (promedio) de una colección (arreglos, iterables y secuencias) de elementos numéricos. El valor de retorno es Double
sin importar el tipo de ítems:
// sintaxis de average() desde un IntArray
fun IntArray.average(): Double
// sintaxis de average() desde un Iterable<Float>
@JvmName("averageOfFloat") fun Iterable<Float>.average(): Double
// sintaxis de average() en una secuencia de Byte
fun Sequence<Byte>.average(): Double
Recuerda que la media se calcula sumando de todos los valores numéricos de la colección y dividiendo este resultado por la cantidad de sumandos que intervienen.
Promedio De Números Ingresados Por Teclado
Considera obtener la media de un arreglo de cinco enteros obtenidos por teclado del usuario. Si el usuario no ingresa una entrada válida, entonces interpretarla como un elemento cero. El siguiente programa representa este comportamiento:
fun main() {
val userNumbers = mutableListOf<Int>()
for (i in 1..5) {
print("Digita número $i:")
val userInput = readLine()
val userNumber = convertUserInput(userInput)
userNumbers += userNumber
}
val average = userNumbers.average()
println("El promedio de $userNumbers es $average")
}
private fun convertUserInput(userInput: String?) = try {
userInput!!.toInt()
} catch (e: Exception) {
0
}
Ejemplo de salida:
Digita número 1:1
Digita número 2:2
Digita número 3:no
Digita número 4:5
Digita número 5:12
El promedio de [1, 2, 0, 5, 12] es 4.0
La solución consiste en leer cinco veces con un bucle for las entradas del usuario en la variable userInput
. Luego se convierte este String
anulable con convertUserInput()
. Si existe una excepción de valor nulo o de conversión a entero, entonces se retorna 0
.
Al final tomamos en la variable average
el promedio obtenido al invocar average()
desde la lista userNumbers
. Y luego se hace la impresión respectiva.
Promedio De Precios De Juguetes
Tomemos otro ejemplo donde la colección de elementos no sea de tipo numérico, sino una clase de datos particular que sea resultante del diseño para una tienda de juguetes. El modelo representa los datos básicos nombre y precio de un juguete:
data class Toy(val name: String, val price: Int)
Ahora, necesitamos calcular el promedio de los precios de los juguetes que se den en una lista. Para ello aplicamos el uso de average()
de la siguiente forma:
fun main() {
val toys = listOf(
Toy("Cubo rubick", 5),
Toy("Rompecabezas de patos", 12),
Toy("Max Steel programador", 20),
Toy("Monopoly", 18)
)
val priceAvgToys = toys.map { it.price }.average()
println("Media de precios: $priceAvgToys")
}
Salida:
Media de precios: 13.75
La solución consiste en usar la función map()
para obtener una colección numérica requerida por la sintaxis de la función. De esta forma podemos promediar los cuatro valores de la propiedad Toy.price
y obtener el resultado 13.75
.