Esta presentación muestra las colecciones disponibles en el lenguaje de programación escala, también contiene pequeños ejemplos que pueden ser útilies.
2. Introducción
Las colecciones o contenedores de objetos están en el lenguaje
de programación Scala. La mayoría de las colecciones que
ofrece son inmutables, estas tienen muchas facilidades para las
operaciones de iteración.
3. Las colecciones de Scala se puede distinguir en dos tipos las mutables, en
estas se puede agregar, cambiar o remover elementos de una colección. Y
las inmutables, al contrario de las mutables nunca cambian, puede existir
operaciones que simulen la modificación, agregación o eliminación, pero
estas operaciones en cada caso retornan una nueva colección y dejan sin
cambiar la antigua.
5. Si se llama a una colección sin un prefijo por ejemplo Import
scala.collection.Set este se refiere a una colección immutable. Para llamar a
una colección mutable se debe llamar de la siguiente forma Import
scala.collection.mutable.Set
Algunos tipos tienen alias que se pueden usar como simples nombres, sin la
necesidad de importar.
7. Traversable
● Todas las operaciones están garantizados para llevar a cabo de una manera un
único subproceso.
● Su única operación es el foreach, que permite aplicar una operación para cada
elemento de una colección.
def foreach[U](f: Elem => U): Unit
● Este método es esencial para la operaciones con Traversable.
● Esta operación se aplica a todas las clases que heredan de Traversable.
8. Iterable
● Un Iterable puede crear un iterador, que está basado en la implementación del
foreach. este define un orden de los elementos.
● Sirve para recorrer los elementos uno por uno.
9. Seq
● Son casos especiales de la clase Iterable. A diferencia de Iterable, siempre
tienen un orden y longitud definida de elementos.
● Seq tiene dos subtrait principales:
○ IndexedSeq
○ LinearSeq
10. IndexedSeq
Se define en términos de dos métodos abstractos:
● apply: Encuentra elemento por su índice
● length: La longitud de la secuencia
Soportan tiempo constante 0 tiempo casi constante en el acceso de un elemento.
11. LinearSeq
Se define en términos de tres métodos abstractos
● isEmpty: indica si la lista está vacía
● head: primer elemento de la secuencia
● tail: todos los elementos de la secuencia excepto el primero
12. Set
Un rasgo base para todos los conjuntos mutables, como inmutables.
Set es una colección que no tiene elementos duplicados.
Set tiene dos subclases que la implementan:
● SortedSet: no elementos duplicados y se encuentran ordenados.
● BitSet: son conjuntos de números enteros no negativos que se representan
como matrices de tamaño variable de bits empaquetados en palabras de 64 bits
13. SortedSet
Se define con los siguientes métodos:
● myOrdering: especifica el orden en el que se debe ordenar el SortedSet
● range: devuelve los elementos de un SortedSet sin incluir el último elemento
● from: devuelve los elementos desde el elemento llamado hasta el final del
sortedset, da como resultado otro sortedset
14. BitSet
Bitsets son conjuntos de elementos enteros no negativos que se implementan en
una o más palabras de bits empaquetados. Este usa arrays de largo de 64 bits que va
almacenando los información.
15. Map
Maps son iterables que contienen pares de claves y valor.
SortedMap: Un Map cuyas claves se encuentran ordenadas.
16. SortedMap
Se define con los siguientes métodos:
● apply: Encuentra elemento por su clave
● get: Busca un valor asociado con una clave
● getOrElse: realiza un trabajo igual al de get
● contains: busca si una clave se encuentra en el sortedset
● idDefiniedAt: método igual al de contains
17. List
Las listas de Scala son bastante similares a los array lo que significa que todos los
elementos de una lista tienen el mismo tipo pero hay dos diferencias importantes:
1. Las listas son inmutables, lo que significa que los elementos de una lista no se
pueden cambiar por asignación.
2. Las listas representan una lista enlazada mientras que los arrays son planas.
18. // inicialización
var numeros: List[ Int ] = List()
var numeros1: List[ Int ] = List( 1 , 2 , 3 , 4 )
var listas: List[ List[Int] ] = List(List(1,0,0), List(0,1,0), List(0,0,1));
println(List.range(1,5)) //Rango de elementos En este caso List(1,2,3,4)
//Inserción
numeros=numeros:+5 //añadir elementos al final list(1,2,3,4,5)
numeros=numeros.::(5) //añadir elementos al inicio List(5,1,2,3,4,5)
19. //concatenar listas
numeros= numeros.:::(List(7,8))
var numeros3 :List[Int]=List(1,2,3,4)
//tamano de una lista
println(numeros3.length)
println(numeros.isEmpty)
// recuperar un elemento
println(numeros3.last) //ultimo elemento de la lista
println(numeros3(2))
20. //modificar
numeros3.updated(2,6) // genera una copia de la lista con el elemento reemplazado, en la posición indicada println(numeros3)
//busqueda
println(numeros3.indexOf(2)) //Retorna el índice del elemento a buscar en la lista, en caso de no encontrar retorna -1
println(numeros3.contains(2)) //Retorna True si encuentra el elemento, caso contrario retorna False.
println(numeros3.find((i: Int) => i % 2 == 0)) //Retorna el primer elemento que cumpla con la condición.
//Sublista
println(numeros3.slice(1,3)) //Retorna una lista que inicia en el elemento de índice del primer parámetro hasta el segundo parámetro
menos 1.
println(numeros3.drop(2)) //Retorna una sublista sin los n primeros elementos
//Generar String
println(numeros3.mkString(",")) // retorna un string con todos los elementos de la lista espaciados por un separador
21. Stream
Posee el mismo comportamiento y rendimiento que una lista. Excepto que posee
lazy evaluation (evaluación perezosa), es decir que sólo se operará con los
elementos cuando sea solicitada la información. Esto también permite que el tamaño
de un Stream pueda ser infinito.
22. Inicialización
//Utilizamos #:: como operador para agregar un elemento al Stream
var numeros = 1 #:: 2#:: 3 #:: 4#:: Stream.empty
//Si imprimimos la lista obtenemos Stream(1,?). El signo de interrogación demuestra que todavía no se analizan los elementos
que han sido ingresados.
//Sin embargo cuando inicie el análisis del stream solo se podrá recorrer hasta el último elemento
//El último elemento de la lista debe ser un Stream. Se puede colocar un Stream nulo como último elemento mediante el
Stream.empty
Los valores sólo se inicializan cuando se realiza una operación Ej:
numeros(1) //Retorna El elemento en posición 1 en este caso 2
//El resto de operaciones se puede realizar de manera similar a List.
23. Vector
Es una colección de datos inmutable. Facilita el acceso aleatorio e inserción de los
elementos utilizando una complejidad algorítmica constante. Trabajo que lo realiza
de manera más efectiva que una lista.
25. Stack
El stack o pila, es una estructura de datos que proporcionan una secuencia de
elementos del tipo LIFO(Last-in-first-out), es decir los elementos se colocan al final
de la pila y son retirados desde la parte final de la pila. Tienen una versión mutable y
otra inmutable.
26. var numeros: Stack[ Int ] = Stack()
var numeros1: Stack[ Int ] = Stack( 1 , 2 , 3 , 4 )
// Inserción
numeros.push(1) //Añadir un elemento al final de la pila. List(1,2,3,4,5)
numeros.push(1,2,3) //Añadir varios elementos al final de la pila. List(1,2,3,4,1,2,3)
27. // Recuperar elemento
println(numeros1.top) //Ultimo elemento de la pila
println(numeros1.last) //Ultimo elemento de la pila
println(numeros1(2)) //Elemento en el índice pos
// Eliminar
numeros1.pop //Elimina el último elemento de la pila
println(numeros1)
// Sublista
println(numeros1.slice(1,3)) //Retorna un array que inicia en el elemento de índice del primer
parámetro
28. Queue
Queue o Fila, es una estructura de datos que proporcionan una secuencia de
elementos del tipo FIFO(Last-in-first-out), es decir el primer elemento que ingresa
es el primero que sale. Tienen una versión mutable y otra inmutable.
29. Inicialización
import scala.collection.mutable.Queue o
import scala.collection.immutable.Queue
var numeros1: Queue[ Int ] = Queue()
var numeros: Queue[ Int ] = Queue( 1 , 2 , 3 , 4 )
// Inserción
/ En filas inmutables
numeros.enqueue(1) //Añadir un elemento al final de la fila. List(1,2,3,4,1)
numeros.enqueue(1,2,3) //Añadir varios elementos al final de la pila. List(1,2,3,4,1,2,3)
//En filas mutables
numeros += 1 //Añadir un elemento al final de la fila.
numeros ++= List(5,6) //Añadir varios elementos al final de la pila
30. val valor= numeros.dequeue //Retorna el primer valor de la fila, este es retirado de
la pila original numeros = Queue(2,3,4)
32. //Inicialización
//Retorna una secuencia de números enteros de uno en uno desde el primer parámetro inclusivo
//hasta el segundo parámetro exclusivo.
var range1: Range = Range(-1,5) //Range(-1,0,1,2,3,4)
var range: Range = 1 to 3
//El tercer parámetro (Debe ser entero) indica la diferencia que existe entre cada elemento de Range.
var range2: Range = Range(-1,5,2) //Range(-1,1,3)
var range4: Range = Range(5,-1,-1) //Range(5,4,3,2,1,0)
//Si deseamos crear un Range que genere una secuencia con segundo parámetro inclusivo
var range5: Range = 1 until 3 //No soporta operaciones de modificación o inserción
33. Array
Scala ofrece una estructura de datos, la matriz , que almacena
una colección de tamaño fijo secuencial de elementos del
mismo tipo.