Estructuras de datos

Programación funcional y reactiva - Computación

Profesor: Ing. Santiago Quiñones

Docente Investigador

Departamento de Ingeniería Civil

Contenidos

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:

  1. El promedio de goles
  2. El nombre del jugador con más goles
  3. El nombre del jugador con menos goles
  4. Una lista con los nombres de los jugadores, cuyo número de goles sea mayor que el promedio
  5. Una lista con los nombres de los jugadores, cuyo número de goles sea menor que el promedio

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
\bar{x} = \frac{\sum_{i=1}^{n} x_i n_i}{N} = \frac{2 \cdot 2 + 3 \cdot 2 + 5 \cdot 1 + 6 \cdot 3}{8} = 4.125 \\ S^2 = \frac{\sum_{i=1}^{n} x_i^2 n_i}{N} - \bar{x}^2 = \frac{2^2 \cdot 2 + 3^2 \cdot 2 + 5^2 \cdot 1 + 6^2 \cdot 3}{8} - 4.125^2 = 2.86 \\ S_x = \sqrt{S^2} = \sqrt{2.86} = 1.69 \\ CV = \frac{S}{\bar{x}} = \frac{1.69}{4.125} = 0.41

Ejercicios

Variación de Pearson

\bar{x} = \frac{\sum_{i=1}^{n} x_i n_i}{N} = \frac{2 \cdot 2 + 3 \cdot 2 + 5 \cdot 1 + 6 \cdot 3}{8} = 4.125 \\ S^2 = \frac{\sum_{i=1}^{n} x_i^2 n_i}{N} - \bar{x}^2 = \frac{2^2 \cdot 2 + 3^2 \cdot 2 + 5^2 \cdot 1 + 6^2 \cdot 3}{8} - 4.125^2 = 2.86 \\ S_x = \sqrt{S^2} = \sqrt{2.86} = 1.69 \\ CV = \frac{S}{\bar{x}} = \frac{1.69}{4.125} = 0.41
val data = List((2, 2), (3, 2), (5, 1), (6, 3))

val N = 

val media = 

val varianza = 

val CV = 

B1S4 Estructuras de datos

By Santiago Quiñones Cuenca

B1S4 Estructuras de datos

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

  • 112