Santiago Quiñones Cuenca
Software Developer and Educator, Master in Software Engineering, Research UTPL {Loja, Ecuador} Repositories: http://github.com/lsantiago
Programación funcional y reactiva - Computación
Estructuras de datos
Introducción
Estructuras de datos funcionales
La programación implica principalmente la manipulación de datos
Tanto las estructuras de datos, como los datos en sí son manipulados de forma diferente en los paradigmas de programación.
Iniciaremos con la noción de una colección de datos.
https://scala-lang.org/api/3.x/
Listas
Listas
Introducción
Una lista (List) es un elemento similar a los arreglos
¿Cuáles son las características de un arreglo?
Existen 2 diferencias fundamentales
Son inmutables
Listas representan una lista enlazada.
Listas
Declaraciones
Listas
Operaciones
Dentro de las listas se pueden realizar algunas operaciones
Listas
Otras funciones que utilizan predicados
Listas
Otras funciones que utilizan predicados
Otras funciones
flaten
Devuelve una colección de elementos mediante la fusión de colecciones secundarias.
val listOfList: List[List[Int]] = List(
List(1, 2),
List(3, 4, 5, 6),
List(6),
List(7, 8)
)
val listNums: List[Int] = listOfList.flatten
Otras funciones
flaten y map
val names: List[String] = List(
"Audrey Romero",
"Beatriz Cevallos",
"Carmen Cabrera",
"Danilo Jaramillo",
"Eduardo Encalada",
"Fernando Davila"
)
Otras funciones
flaten + map = flatMap
Otras funciones
Funciones combinadas
Otras funciones
reduce
val nums: List[Int] = List(1, 2, 3, 4)
def add(x: Int, y: Int): Int = {
val theSum = x + y
println(s"recibido $x y $y, su suma es $theSum")
theSum
}
Otras funciones
foldLeft
Otras funciones
foldLeft
Tuplas
Tuplas
Definición
Una tupla es un contenedor de datos en donde cada elemento puede ser de diferente tipo.
Se puede acceder a cada elemento de forma independiente, utilizando punto, guion y un índice.
Tuplas
¿Cómo declarara su tipo?
El tipo depende del número de elementos y el tipo de dato de cada uno, así:
Tuplas
Algunas funciones
Otras funciones
Revisión de detalles
val productos: List[Tuple3[String, Int, Double]] = List(
("Zapatos", 10, 50),
("Camisas", 20, 30),
("Pantalones", 15, 40),
("Gorras", 18, 15),
("Calcetines", 50, 5)
)
// Filtrar productos con precio unitario mayor a 35.0
val filtrados: List[Tuple3[String, Int, Double]] =
productos.filter(p => p._3 > 35.0)
// Calcular el total de ventas por producto
val totalVentas: List[Double] =
productos.map(p => p._2 * p._3)
// Generar una lista detallada de precios
val listaDetallada: List[Double] =
productos.flatMap(p => List.fill(p._2)(p._3))
// Calcular el ingreso total
val ingresoTotales: Double =
productos.foldLeft(0.0)((sum, tuple) => sum + tuple._3 * tuple._2)
// Calcular el precio promedio de los productos
val precioPromedio: Double =
productos
.map(_._3)
.reduce(_ + _)
// Imprimir resultados
println(s"Productos filtrados: $filtrados")
println(s"Total de ventas por producto: $totalVentas")
println(s"Lista detallada de precios: $listaDetallada")
println(f"Ingreso total: $ingresoTotales%.2f")
println(f"Precio promedio: $precioPromedio%.2f")
Ejercicios y resolución de problemas
Ejemplo
Representar lista de goleadores de campeonato de fútbol
val goleadores = List(
("Francisco Fydriszewski", 10),
("Joaquín Vergés", 9),
("Santiago Giordana", 9),
("Ismael Díaz", 8),
("Tomás Molina", 7),
("Danny Luna", 7),
("Cristian Martínez", 7),
("Gabriel Cortez", 7),
("Leonardo Villagra", 6),
("Michael Hoyos", 6)
)
Ejemplo
Representar lista de goleadores de campeonato de fútbol
Encuentre:
Ejemplo
Promedio de goles
Ejemplo
Goleador
Ejemplo
Jugador con menos goles
Ejemplo
Jugadores con goles mayores al promedio
Ejemplo
Jugadores con goles menor al promedio
Ejercicios
Práctica
Ejercicios
Práctica
val names = List("rené", "juan", "eduardo", "daniel", "ramiro", "jorge")
// crear una nueva lista con la longitud de cada nombre
val len_names = names.map(_.length)
// con los nombres en mayúscula de aquellos cuya longitud es mayor que o igual a 5
val filter_names = names.filter(_.length >= 5).map(_.toUpperCase())
// con la primera letra de cada nombre
val first_letter_names = names.map(_.charAt(0))
// con los nombres escritos en sentido contrario
val names_inverse = names.map(_.reverse)
Ejercicios
Representando un tabla
Ejercicios
Lista de listas: Representación
val table = List(
List(2, 1.4, 0.9, 1.7),
List(2, 2, 1.8, 1.9),
List(0.7, 0.9, 1, 1.3),
List(1.2, 1.4, 1.5, 1.3),
List(0.8, 1.1, 1.5, 1.3)
)
Ejercicios
Lista de listas: Representación
val table = List(
List(2, 1.4, 0.9, 1.7),
List(2, 2, 1.8, 1.9),
List(0.7, 0.9, 1, 1.3),
List(1.2, 1.4, 1.5, 1.3),
List(0.8, 1.1, 1.5, 1.3)
)
Ejercicios
Variación de Pearson
Elabore un Programa en Scala que a través de los principios de programación funcional resuelva el siguiente problema.
Calcular el coeficiente de variación de Pearson (Cvx)
Sea x el número de habitaciones que tiene los 8 pisos que forman un bloque de departamentos.
Ejercicios
Variación de Pearson
X | ni |
---|---|
2 | 2 |
3 | 2 |
5 | 1 |
6 | 3 |
Ejercicios
Variación de Pearson
val data = List((2, 2), (3, 2), (5, 1), (6, 3))
val N =
val media =
val varianza =
val CV =
By Santiago Quiñones Cuenca
Presentación de estructura de datos para aplicar funciones como filtrado, mapeo, reducción y concatenación de las mismas, haciendo énfasis en los resultados parciales
Software Developer and Educator, Master in Software Engineering, Research UTPL {Loja, Ecuador} Repositories: http://github.com/lsantiago